<?php

namespace app\payment\model;

use think\Model;
use think\facade\Cache;
use think\facade\Env;
use think\facade\Log;
use think\facade\Request;
use think\Db;

/**
 * 所有支付公司模型
 */
class AllPaymentCompany extends Model
{

    /**
     * 海贝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function haibeifu($parameters = [], $pay_config = [])
    {

        // SDK下单接口（wechat_h5:微信、alipay_h5:支付宝）
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wechat_h5';
                $method = 'sdk.web';
                break;
            case 'alipay_h5':
                $type = 'alipay_h5';
                $method = 'sdk.web';
                break;
            case 'wangyin':
                $type = 'network_union_pay';
                $method = 'sdk.web';
                break;
            case 'kuaijie':
                $type = 'express_union_pay';
                $method = 'sdk.web';
                break;
            case 'wechat_scan_code':
                $type = 'wechat.scan.code';
                $method = 'wechat.scan.code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $datas = [
            'waresName' => $parameters['body'], // 商品名称
            'cpOrderId' => $parameters['order_id'], // 商户订单号
            'price' => $parameters['cash'], // 付款金额,
            'returnUrl' => $parameters['return_url'], // 返回链接，带http的全连接，不含参数
            'notifyUrl' => $pay_config['notify_url'], // 异步通知地址，带http的全连接，不含参数
            'type' => $type, // 请求支付类型
        ];
        if ($parameters['type'] == 'wangyin') {
            $bank_name = [
                'ICBC' => '001', // 中国工商银行
                'CMBC' => '002', // 招商银行
                'CBC' => '003', // 中国建设银行
                'BC' => '004', // 中国银行
                'ABC' => '005', // 中国农业银行
                'BCM' => '006', // 交通银行
                'SPDB' => '007', // 上海浦东发展银行
                'GDB' => '008', // 广东发展银行
                'CNCB' => '009', // 中信银行
                'CEB' => '010', // 中国光大银行
                'CIB' => '011', // 兴业银行
                'PABC' => '012', // 平安银行
                'CMBC' => '013', // 中国民生银行
                'HB' => '014', // 华夏银行
                'PSBC' => '020', // 中国邮政储蓄银行
                'NBCB' => '024', // 宁波银行
                'BCCB' => '045', // 北京银行
                'CZB' => '044', // 浙商银行
            ];
            $bank_code = strtoupper($parameters['bank_code']);
            $datas['bankCardType'] = isset($bank_name[$bank_code]) ? $bank_name[$bank_code] : '001';
        }
        $arr = [
            'appid' => $pay_config['app_id'], // 应用id
            'once' => $parameters['order_id'], // 随机字符串，保证每次请求都不一样
            'timestamp' => time(), // 发起请求时的时间戳
            'attach' => '', // 附带请求参数，API服务不做任何处理，原值返回
            'version' => $pay_config['version'], // 请求接口版本号，默认为1.0.0
            'sign_type' => 'MD5', // 签名类型：默认为MD5，可选择：MD5、RSA
            'format' => 'JSON', // 返回数据格式，默认为JSON，可选择：JSON、XML
            'method' => $method, // 接口方法名称
            'data' => json_encode($datas),
        ];
        // 签名开始
        $arr['key'] = $pay_config['key'];  // 密钥
        ksort($arr);                       // 按关键字字母排序
        $formatData = [];
        foreach ($arr as $k => $v) {
            if (!empty($v) && $k != 'sign') {
                $formatData[] = "$k=$v";
            }
        }
        $signStr = implode('&', $formatData);
        $arr['sign'] = strtoupper(md5($signStr));
        // 签名结束
        $request_url = $pay_config['request_url'];  // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 10000) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 海贝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function haibeifuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $datas = [
            'orderSn' => $order_id, // 第三方订单号
        ];
        $arr = [
            'appid' => $pay_config['app_id'], // 应用id
            'once' => date('YmdHis') . rand(600000, 999999), // 随机字符串，保证每次请求都不一样
            'timestamp' => time(), // 发起请求时的时间戳
            'attach' => '', // 附带请求参数，API服务不做任何处理，原值返回
            'version' => $pay_config['version'], // 请求接口版本号，默认为1.0.0
            'sign_type' => 'MD5', // 签名类型：默认为MD5，可选择：MD5、RSA
            'format' => 'JSON', // 返回数据格式，默认为JSON，可选择：JSON、XML
            'method' => 'order.query', // 接口方法名称 查询订单方法
            'data' => json_encode($datas),
        ];
        // 签名开始
        $arr['key'] = $pay_config['key'];   // 密钥
        ksort($arr);                        // 按关键字字母排序
        $formatData = [];
        foreach ($arr as $k => $v) {
            if (!empty($v) && $k != 'sign') {
                $formatData[] = "$k=$v";
            }
        }
        $signStr = implode('&', $formatData);
        $arr['sign'] = strtoupper(md5($signStr));
        // 签名结束
        $request_url = $pay_config['request_url'];  // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 10000) {
            $results = json_decode($resarray['result'], true);
            if (isset($results['pay_state']) && $results['pay_state'] == 60000) {
                // 支付成功
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /**
         * 成功     SUCCESS = 60000;
         * 未支付   UNPAID = -1;
         * 失败     FAIL = 999;
         */
    }

    /**
     * 美团支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function meituanpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 'wx_scan_pay';
                break;
            case 'alipay_h5':
                $type = 'ali_scan_pay';
                break;
            case 'alipay_scan_code':
                $type = 'ali_scan_pay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['outTradeNo'] = $parameters['order_id'];                   // 必填 接入方订单号，由接入方生成，不能重复
        $arr['totalFee'] = intval(strval($parameters['cash'] * 100));   // 必填 订单金额，单位为分
        $arr['subject'] = $parameters['body'];                    // 必填 订单主题
        $arr['body'] = $parameters['body'];                       // 必填 接订单内容,不超过64个字符
        $arr['channel'] = $type;                                        // 必填 支付渠道：'wx_scan_pay':微信扫码支付 'ali_scan_pay':支付宝扫码支付
        $arr['expireMinutes'] = 10;                                     // 暂未启用，创建支付订单后，订单关闭时间，目前固定2分钟
        $arr['tradeType'] = 'NATIVE';                                   // 必填 交易类型 'NATIVE'： 返回二维码url (动态二维码) 'JSAPI'： 返回会话标识等信息调起客户端支付sdk(静态二维码)
        if ($parameters['type'] == 'wechat_scan_code') {
            $arr['openId'] = input('openId', 'o0DJs1b3xy27CzwDe3QagHAAi-R0');  // 必填 接微信主扫且tradeType为JSAPI时必填,为支付宝或微信各自的openId，获取方式参考H5接口 针对个人用户openid
            $arr['tradeType'] = 'JSAPI';                                       // 必填 交易类型 'NATIVE'： 返回二维码url (动态二维码) 'JSAPI'： 返回会话标识等信息调起客户端支付sdk(静态二维码)
        }
        $arr['notifyUrl'] = $pay_config['notify_url'];                  // 支付成功通知回调地址
        $arr['merchantId'] = $pay_config['merchant_id'];                // 必填 开放平台分配的商户id, 目前是 美团POI ID
        $arr['appId'] = $pay_config['app_id'];                          // 必填 接入方订单号，由接入方生成，不能重复
        $arr['random'] = time() . rand(100000, 999999);                 // 随机数

        ksort($arr);
        $str = ''; //处理字符串
        $arr = array_filter($arr);
        $str = urldecode(http_build_query($arr));
        $str = $str . '&key=' . $pay_config['key'];
        $str = hash('sha256', $str);
        $arr['sign'] = $str;

        $request_url = $pay_config['request_url'];    // 请求地址
        //$resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second']);

        $header = array(
            "Content-type: application/json;charset='utf-8'",
            "Accept: application/json",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
        );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request_url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arr));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        $resdata = curl_exec($ch);
        curl_close($ch);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 'SUCCESS') {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 美团支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function meituanpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['outTradeNo'] = $order_id;                            // 必填 接入方订单号，由接入方生成，不能重复
        $arr['merchantId'] = $pay_config['merchant_id'];           // 必填 开放平台分配的商户id, 目前是 美团POI ID
        $arr['appId'] = $pay_config['app_id'];                     // 必填 接入方订单号，由接入方生成，不能重复
        $arr['random'] = date('YmdHis') . rand(100000, 999999);    // 随机数
        ksort($arr);
        $str = ''; //处理字符串
        $arr = array_filter($arr);
        $str = urldecode(http_build_query($arr));
        $str = $str . '&key=' . $pay_config['key'];
        $str = hash('sha256', $str);
        $arr['sign'] = $str;

        $request_url = $pay_config['request_url_query'];           // 请求地址
        //$resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second']);

        $header = array(
            "Content-type: application/json;charset='utf-8'",
            "Accept: application/json",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
        );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request_url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arr));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        $resdata = curl_exec($ch);
        curl_close($ch);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['orderStatus']) && $resarray['orderStatus'] == 'ORDER_SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /**
          订单状态
          'ORDER_NEW'           ：交易新建
          'ORDER_FAILED'        ：交易失败
          'ORDER_REVERSALING'   ：交易冲正中
          'ORDER_REVERSAL'      ：交易冲正
          'ORDER_SUCCESS'       ：交易成功
          'ORDER_PART_REFUND'   ：交易半退
          'ORDER_ALL_REFUND'    ：交易全退
          'ORDER_REFUNDING'     ：退款中
          'ORDER_CLOSE'         ：交易失败
         */
    }

    /**
     * 收呗支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function shoubei($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 400;
                break;
            case 'wechat_h5':
                $type = 400;
                break;
            case 'alipay_h5':
                $type = 300;
                break;
            case 'alipay_scan_code':
                $type = 300;
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['inst_no'] = $pay_config['app_id'];                   // 机构号 ，通过收呗系统分配
        $arr['mch_no'] = $pay_config['merchant_id'];               // mch_no收呗系统商户号
        //$arr['shop_no'] = $pay_config['public_key'];             // 收呗系统门店号 选填
        //$arr['pay_type'] = $type;                                // 支付类型：000代表不选自动识别，300支付宝，400微信 ，500口碑
        $arr['pay_trace_no'] = $parameters['order_id'];            // 请求流水号 
        $arr['pay_time'] = date('YmdHis');                         // 请求支付时间yyyyMMddHHmmss
        $arr['total_amount'] = intval(strval($parameters['cash'] * 100));  // 支付金额 分
        $arr['order_body'] = $parameters['body'];            // 订单描述
        $arr['notify_url'] = $pay_config['notify_url'];            // 回调地址 
        $arr['front_url'] = $pay_config['notify_url'];             // 前端回调地址 
        $arr['auto_payment'] = 1;                                  // 是否自动调起支付 （不传默认0 ） 0不自动 1自动调起 
        $arr['attach'] = rand(100000, 999999);                     // 自定义参数原样返回 

        $key = $pay_config['key'];
        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = md5($string);

        $header = array('Content-Type: application/json');

        $request_url = $pay_config['request_url'];                 // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['return_code']) && $resarray['return_code'] == 'SUCCESS') {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 收呗支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function shoubeiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['inst_no'] = $pay_config['app_id'];                           // 机构号
        $arr['mch_no'] = $pay_config['merchant_id'];                       // 商户号
        $arr['query_trace_no'] = date('YmdHis') . rand(100000, 999999);    // 查询请求流水号
        $arr['pay_trace_no'] = $order_id;                                  // 支付请求流水号（支付订单号和支付请求流水号二选其一必传）
        $arr['pay_time'] = date('YmdHis', $recharge['create_time']);       // 支付请求时间

        $key = $pay_config['key'];
        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = md5($string);

        $header = array('Content-Type: application/json');

        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /**
         * 交易订单状态，
         * SUCCESS支付成功，
         * REFUND转入退款，
         * NOTPAY未支付，
         * CLOSED已关闭，
         * USERPAYING用户支付中，
         * REVOKED已撤销，
         * NOPAY未支付支付超时，
         * PAYERROR支付失败
         */
    }

    /**
     * 优聚合支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function ujubank($parameters = [], $pay_config = [])
    {

        $arr['mch_id'] = $pay_config['merchant_id'];                    // 商户号（接入时下发,或通过接口进件获得）
        $arr['out_trade_no'] = $parameters['order_id'];                 // 商户平台流水号,商户订单号
        $arr['body'] = $parameters['body'];                       // 商品名称
        $arr['callback_url'] = $parameters['return_url'];               // 支付完成跳转地址,前台通知地址
        $arr['notify_url'] = $pay_config['notify_url'];                 // 异步通知地址
        $arr['total_fee'] = $parameters['cash'];                        // 交易金额(单位：元)
        // 接口类型（wx:微信、al:支付宝、qq:qq钱包、jd:京东、wy:网银支付）
        // 支付方式（h5：公众号支付或者其他js支付、pay：扫码或者网关支付、micropay：被扫支付、wap：wap支付）
        switch ($parameters['type']) {
            case 'wechat_h5':
                $arr['service'] = 'wx';
                $arr['way'] = 'wap';
                break;
            case 'alipay_h5':
                $arr['service'] = 'al';
                $arr['way'] = 'wap';
                break;
            case 'kuaijie':
                $arr['service'] = 'kj';
                $arr['way'] = 'wap';
                break;
            case 'wangyin':
                $arr['service'] = 'wy';
                $arr['way'] = 'wap';
                break;
            case 'jd_h5':
                $arr['service'] = 'yl';
                $arr['way'] = 'pay';
                break;
            case 'qq_h5':
                $arr['service'] = 'qq';
                $arr['way'] = 'wap';
                break;
            case 'wechat_scan_code':
                $arr['service'] = 'wx';
                $arr['way'] = 'pay';
                break;
            case 'alipay_scan_code':
                $arr['service'] = 'al';
                $arr['way'] = 'pay';
                break;
            case 'unionpay_scan_code':
                $arr['service'] = 'yl';
                $arr['way'] = 'pay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['format'] = 'json';                             // 返回数据格式
        $key = $pay_config['key'];                           // 密钥
        $array_values = array_values($arr);                  // 获取数组键值
        $strval = implode('', $array_values);                // 将一个一维数组的值转化为字符串
        $arr['sign'] = md5($strval . $key);                  // MD5后的校验字段,上面的数组顺序固定。
        $arr['appid'] = $pay_config['app_id'];               // appid
        $arr['mch_create_ip'] = $parameters['ip'];           // 客户端ip
        $request_url = $pay_config['request_url'];           // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['success']) && $resarray['success'] == 'true') {
            // 成功     
            $verify_param = $resarray['order_id'];
            $url = $resarray['pay_info'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 优聚合支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function ujubankVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'mch_id' => $pay_config['merchant_id'],
            'transaction_id' => $order_id,
            'nonce_str' => date('YmdHis') . rand(600000, 999999),
        ];
        $array_values = array_values($arr);                      // 获取数组键值
        $strval = implode('', $array_values);                    // 将一个一维数组的值转化为字符串
        $arr['sign'] = md5($strval . $key);                      // 签名字符串
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          SUCCESS    —支付成功
          REFUND     —转入退款
          NOTPAY     —未支付
          CLOSED     —已关闭
          PAYERROR   —支付失败(其他原因，如银行返回失败)
         */
    }

    /**
     * 汇付通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function huifutong($parameters = [], $pay_config = [])
    {

        $arr['mch_id'] = $pay_config['merchant_id'];                      // 商户号（接入时下发,或通过接口进件获得）
        $arr['out_trade_no'] = $parameters['order_id'];                   // 商户号平台流水号,商户号订单号
        $arr['body'] = $parameters['body'];                         // 商品名称
        $arr['callback_url'] = $pay_config['notify_url'];                 // 支付完成跳转地址,前台通知地址
        $arr['notify_url'] = $pay_config['notify_url'];                   // 异步通知地址
        $arr['total_fee'] = $parameters['cash'];                          // 交易金额(单位：元)
        // 接口类型（wx:微信、al:支付宝、qq:qq钱包、jd:京东、wy:网银支付）
        // 支付方式（h5：公众号支付或者其他js支付、pay：扫码或者网关支付、micropay：被扫支付、wap：wap支付）
        switch ($parameters['type']) {
            case 'wechat_h5':
                $arr['service'] = 'wx';
                $arr['way'] = 'wap';
                break;
            case 'alipay_h5':
                $arr['service'] = 'al';
                $arr['way'] = 'wap';
                break;
            case 'kuaijie':
                $arr['service'] = 'kj';
                $arr['way'] = 'wap';
                break;
            case 'wangyin':
                $arr['service'] = 'wy';
                $arr['way'] = 'wap';
                break;
            case 'jd_h5':
                $arr['service'] = 'yl';
                $arr['way'] = 'pay';
                break;
            case 'qq_h5':
                $arr['service'] = 'qq';
                $arr['way'] = 'wap';
                break;
            case 'wechat_scan_code':
                $arr['service'] = 'wx';
                $arr['way'] = 'pay';
                break;
            case 'alipay_scan_code':
                $arr['service'] = 'al';
                $arr['way'] = 'wap';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['format'] = 'json';                             // 返回数据格式
        $key = $pay_config['key'];                           // 密钥
        $array_values = array_values($arr);                  // 获取数组键值
        $strval = implode('', $array_values);                // 将一个一维数组的值转化为字符串
        $arr['sign'] = md5($strval . $key);                  // MD5后的校验字段,上面的数组顺序固定。
        $arr['Appid'] = $pay_config['app_id'];               // appid
        $arr['mch_create_ip'] = $parameters['ip'];           // 客户端ip
        $arr['goods_tag'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';  // 银行编码：网银支付网银编码（第三方收银台时此参数为空）
        $arr['sub_openid'] = rand(100000, 999999);           // 用户的openid，微信公众号支付时候必须填写，其他情况不用传参数，备注：第三方说要传（玩家id）做验证 

        $request_url = $pay_config['request_url'];           // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['success']) && $resarray['success'] == 'true') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 汇付通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huifutongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'mch_id' => $pay_config['merchant_id'],
            'transaction_id' => $order_id,
            'nonce_str' => date('YmdHis') . rand(600000, 999999),
        ];
        $array_values = array_values($arr);                      // 获取数组键值
        $strval = implode('', $array_values);                    // 将一个一维数组的值转化为字符串
        $arr['sign'] = md5($strval . $key);                      // 签名字符串
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          SUCCESS    —支付成功
          REFUND     —转入退款
          NOTPAY     —未支付
          CLOSED     —已关闭
          PAYERROR   —支付失败(其他原因，如银行返回失败)
         */
    }

    /**
     * 汇付通二支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function huifutongtwo($parameters = [], $pay_config = [])
    {

        // 接口类型（wx:微信、al:支付宝、qq:qq钱包、jd:京东、wy:网银支付）
        // 支付方式（h5：公众号支付或者其他js支付、pay：扫码或者网关支付、micropay：被扫支付、wap：wap支付）
        switch ($parameters['type']) {
            case 'wechat_h5':
                $arr['service'] = 'wx';
                $arr['way'] = 'wap';
                break;
            case 'alipay_h5':
                $arr['service'] = 'al';
                $arr['way'] = 'wap';
                break;
            case 'kuaijie':
                $arr['service'] = 'kj';
                $arr['way'] = 'wap';
                break;
            case 'wangyin':
                $arr['service'] = 'wy';
                $arr['way'] = 'wap';
                break;
            case 'jd_h5':
                $arr['service'] = 'yl';
                $arr['way'] = 'pay';
                break;
            case 'qq_h5':
                $arr['service'] = 'qq';
                $arr['way'] = 'wap';
                break;
            case 'wechat_scan_code':
                $arr['service'] = 'wx';
                $arr['way'] = 'pay';
                break;
            case 'alipay_scan_code':
                $arr['service'] = 'al';
                $arr['way'] = 'wap';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['mchId'] = $pay_config['merchant_id'];           // 商户号
        $arr['outTradeNo'] = $parameters['order_id'];         // 商户订单号
        $arr['body'] = $parameters['body'];             // 商品描述
        $arr['subOpenid'] = 'subOpenid';                      // 微信公众号支付时候必须填写，其他情况不用传参数
        $arr['callbackUrl'] = $pay_config['notify_url'];      // 异步回调  
        $arr['totalFee'] = $parameters['cash'];               // 以“元”为单位必须保留两位小数
        $arr['appId'] = '12345';                              // 应用编号
        $arr['goodsTag'] = 'ICBC';                            // 网银支付网银编码
        $arr['mchCreateIp'] = $parameters['ip'];              // ip地址：wap支付时，wap发起H5终端IP，和微信客户端获得IP需要为同一个IP

        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $header = array("Content-type: application/json;charset='utf-8'");

        $request_url = $pay_config['request_url'];                         // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payInfo']) && strlen($resarray['payInfo']) > 20) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 汇付通二支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huifutongtwoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['mchId'] = $pay_config['merchant_id'];             // 商户号
        $arr['outTradeNo'] = $order_id;                         // 商户订单号
        $arr['traceNo'] = rand(100000, 999999);

        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $header = array("Content-type: application/json;charset='utf-8'");

        $request_url = $pay_config['request_url_query'];        // 请求查询地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['resultCode']) && $resarray['resultCode'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 简单支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function easypay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '10001';
                break;
            case 'alipay_scan_code':
                $type = '10001';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['uid'] = $pay_config['merchant_id'];                // 商户号
        $arr['price'] = $parameters['cash'];                     // 金额，单位：元，精准到两位小数
        $arr['istype'] = $type;                                  // 支付类型10001：转账
        $arr['notify_url'] = $pay_config['notify_url'];          // 必填，异步回调地址
        $arr['return_url'] = '123';                              // 必填，同步回调地址 
        $arr['format'] = 'json';                                 // 必填(目前可以随意传个字符串)
        $arr['orderid'] = $parameters['order_id'];               // 必填，商户订单号
        $arr['orderuid'] = rand(100000, 999999);                 // 必填，商户传的数据异步回调会回传回去
        $arr['goodsname'] = $parameters['body'];           // 必填,商品名称

        $key = $pay_config['key'];
        $arr['key'] = md5('format=' . $arr['format'] . '&goodsname=' . $arr['goodsname'] . '&istype=' . $arr['istype'] . '&notify_url=' . $arr['notify_url'] . '&orderid=' . $arr['orderid'] . '&orderuid=' . $arr['orderuid'] . '&price=' . $arr['price'] . '&return_url=' . $arr['return_url'] . '&uid=' . $arr['uid'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];               // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['result']['qrcode']) && strlen($resarray['result']['qrcode']) > 20) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 简单支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function easypayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['uid'] = $pay_config['merchant_id'];                // 商户号
        $arr['price'] = 0.01;                                    // 金额，单位：元，精准到两位小数                                  
        $arr['orderid'] = $order_id;                             // 必填，商户订单号
        $arr['orderuid'] = '13579';                              // 必填，商户传的数据异步回调会回传回去

        $key = $pay_config['key'];
        $arr['key'] = md5('orderid=' . $arr['orderid'] . '&orderuid=' . $arr['orderuid'] . '&price=' . $arr['price'] . '&uid=' . $arr['uid'] . '&key=' . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['result']['status']) && $resarray['result']['status'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          订单状态0待支付，1支付成功，2支付失败，3订单过期
         */
    }

    /**
     * 快捷付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function kuaijiefu($parameters = [], $pay_config = [])
    {

        /*
          900   微信扫码
          901   微信H5
          902 ⽀付宝扫码
          903 ⽀付宝H5
         */
        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = '903';
                break;
            case 'alipay_scan_code':
                $paytype = '902';
                break;
            case 'wechat_h5':
                $paytype = '901';
                break;
            case 'wechat_scan_code':
                $paytype = '900';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['service'] = 'directPay';                                          // 接口名称
        $arr['merchantId'] = $pay_config['merchant_id'];                        // 商户号
        $arr['notifyUrl'] = $pay_config['notify_url'];                          // 通知接收URL
        $arr['returnUrl'] = $pay_config['notify_url'];                          // 结果返回URL
        $arr['inputCharset'] = 'UTF-8';                                         // 字符集
        $arr['outOrderId'] = $parameters['order_id'];                           // 合作伙伴交易号 
        $arr['subject'] = $parameters['order_id'];                              // 商品的标题
        $arr['body'] = $parameters['order_id'];                                 // 商品的具体描述
        $arr['transAmt'] = $parameters['cash'];                                 // 单位为元
        $arr['payMethod'] = $paytype;                                           // 支付方式
        $arr['defaultBank'] = '';                                               // 银行编码
        //$arr['authCode'] = rand(100000, 999999);                              // 用户id
        $arr['channel'] = 'B2C';                                                // 银行类型
        $arr['cardAttr'] = '01';                                                // 卡类型，固定为01
        $arr['attach'] = rand(100000, 999999);                                  // 商户原路返回信息

        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = substr($string, 0, -1) . $pay_config['key'];

        $arr['signType'] = "MD5";
        $arr['sign'] = md5($string);

        $request_url = $pay_config['request_url'];                              // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 快捷付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function kuaijiefuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        switch ($recharge['type']) {
            case 'alipay_h5':
                $paytype = '903';
                break;
            case 'alipay_scan_code':
                $paytype = '902';
                break;
            case 'wechat_h5':
                $paytype = '901';
                break;
            case 'wechat_scan_code':
                $paytype = '900';
                break;
            default:
                $paytype = '903';
        }
        $arr['merchantId'] = $pay_config['merchant_id'];                   // 商户号
        $arr['payMethod'] = $paytype;                                      // 支付方式
        $arr['orderId'] = $order_id;                                       // 订单号
        $arr['payMoney'] = $recharge['cash'] / 100;                        // 金额
        $arr = array_filter($arr);
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = substr($string, 0, -1) . $pay_config['key'];

        $arr['signType'] = "MD5";
        $arr['sign'] = md5($string);

        $request_url = $pay_config['request_url_query'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['flag']) && $resarray['data']['flag'] == '1') {
            // 支付成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          flag status 订单状态
          0    0      订单处理中
          1    0      订单通知失败
          1    1      订单成功
         */
    }

    /**
     * 付玲珑支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function fulinglong($parameters = [], $pay_config = [])
    {
        switch ($parameters['type']) {
            case 'bank_transfer':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['timestamp'] = time();                              // 时间戳
        $arr['sub_openid'] = '姓名';                             // 姓名
        $arr['sub_appid'] = '6217002870051515849';               // 卡号
        $arr['mch_id'] = $pay_config['merchant_id'];             // 商户号
        $arr['out_trade_no'] = $parameters['order_id'];          // 商户订单号
        $arr['callback_url'] = $parameters['return_url'];        // 支付完成跳转地址,前台通知地址
        $arr['notify_url'] = $pay_config['notify_url'];          // 通知地址
        $arr['total_fee'] = $parameters['cash'];                 // 金额9.99 到10.1
        $arr['service'] = 'wy';                                  // 接口类型网银
        $arr['way'] = 'wap';                                     // 支付方式
        $arr['format'] = 'json';                                 // 返回数据格式
        $vals = array_values($arr);                              // 获取数组键值
        $strval = implode('', $vals);                            // 将一个一维数组的值转化为字符串

        $arr['sign'] = strtoupper(md5($strval . $pay_config['key']));    // MD5后的校验字段,上面的数组顺序固定。

        $arr['mch_create_ip'] = $parameters['ip'];               // 微信客户端获得IP需要为同一个IP
        $arr['body'] = $parameters['body'];                // 商品描述
        $arr['attach'] = date('YmdHis') . rand(100000, 999999);  // 扩展
        $urlval = http_build_query($arr);

        $request_url = $pay_config['request_url'];
        $url = $request_url . '?' . $urlval;
        return ['code' => 300, 'msg' => substr($url, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 付玲珑支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function fulinglongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'mch_id' => $pay_config['merchant_id'],
            'out_trade_no' => $order_id,
            'nonce_str' => date('YmdHis') . rand(100000, 999999),
        ];
        $array_values = array_values($arr);                      // 获取数组键值
        $strval = implode('', $array_values);                    // 将一个一维数组的值转化为字符串
        $arr['sign'] = md5($strval . $key);                      // 签名字符串
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          SUCCESS    —支付成功
          REFUND     —转入退款
          NOTPAY     —未支付
          CLOSED     —已关闭
          PAYERROR   —支付失败(其他原因，如银行返回失败)
         */
    }

    /**
     * 快捷支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function kjpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $request_url = $pay_config['request_url_wechat'];           // 微信接口请求地址
                break;
            case 'alipay_h5':
                $request_url = $pay_config['request_url_alipay'];           // 支付宝接口请求地址	
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['merchant_no'] = $pay_config['merchant_id'];           // 商户号
        $arr['merchant_order_no'] = $parameters['order_id'];        // 商户订单号
        $arr['notify_url'] = $pay_config['notify_url'];             // 商户通知地址
        $arr['return_url'] = $parameters['return_url'];             // 商户跳转地址
        $arr['start_time'] = date('YmdHis');                        // 商户提交时间
        $arr['trade_amount'] = $parameters['cash'];                 // 订单金额(单位:元)
        $arr['body'] = $parameters['body'];             // 商品名称
        $arr['goods_desc'] = $parameters['body'];             // 商品描述
        // 开始：微信支付添加参数，但是支付宝添加无影响
        $arr['user_ip'] = $parameters['ip'];                        // IP地址
        $arr['pay_sence'] = '{"type":"Wap","wap_url": "http://www.baidu.com","wap_name": "baidu"}';  // 支付场景 
        // 结束
        $arr['sign_type'] = 1;                                      // 签名类型(1md5)
        $arr['app_no'] = $pay_config['app_id'];                      // 应用id
        ksort($arr);
        $key = $pay_config['key'];                                  // 密钥
        $arr['sign'] = md5(urldecode(http_build_query($arr) . '&key=' . $key));   // 签名,urldecode解码已编码的 URL 字符串(原始值)
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            // 成功     
            $results = $resarray['data'];
            $verify_param = $results['trade_no'];
            $url = $results['pay_url'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 快捷支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function kjpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        switch ($recharge['type']) {
            case 'wechat_h5':
                $request_url = $pay_config['request_url_wechat_query'];
                break;
            case 'alipay_h5':
                $request_url = $pay_config['request_url_alipay_query'];
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['merchant_no'] = $pay_config['merchant_id'];                              // 商户号
        $arr['trade_no'] = $order_id;                                                  // 商户订单号
        $arr['notify_url'] = $pay_config['notify_url'];                                // 商户通知地址
        $arr['return_url'] = $pay_config['return_url'];                                // 商户跳转地址
        $arr['start_time'] = date('YmdHis');                                           // 商户提交时间
        $arr['trade_amount'] = 1;                                                      // 订单金额(单位:元)
        $arr['body'] = '商品名称';                                               // 商品名称
        $arr['goods_desc'] = '商品描述';                                               // 商品描述
        $arr['sign_type'] = 1;                                                         // 签名类型(1md5)
        ksort($arr);
        $key = $pay_config['key'];                                                     // 密钥
        $arr['sign'] = md5(urldecode(http_build_query($arr) . '&key=' . $key));        // 签名,urldecode解码已编码的 URL 字符串(原始值)
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            if (isset($resarray['data']['status']) && $resarray['data']['status'] == 1) {
                // 支付成功
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /**
         * 成功     status = 1;
         * 未支付   status = -1;
         * 失败     status = 2;
         */
    }

    /**
     * 三通付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function threelink($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $request_url = $pay_config['request_url_wechat'];   // 微信接口请求地址
                break;
            case 'alipay_scan_code':
                $request_url = $pay_config['request_url_alipay'];   // 支付宝接口请求地址	
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['merchant_no'] = $pay_config['merchant_id'];           // 商户号
        $arr['merchant_order_no'] = $parameters['order_id'];        // 商户号订单号
        $arr['notify_url'] = $pay_config['notify_url'];             // 商户号通知地址
        $arr['return_url'] = $parameters['return_url'];             // 商户号跳转地址
        $arr['start_time'] = date('YmdHis');                        // 商户号提交时间
        $arr['trade_amount'] = $parameters['cash'];                 // 订单金额(单位:元)
        $arr['body'] = $parameters['body'];             // 商品名称
        $arr['goods_desc'] = $parameters['body'];             // 商品描述
        // 开始：微信支付添加参数，但是支付宝添加无影响
        $arr['user_ip'] = $parameters['ip'];                        // IP地址
        $arr['pay_sence'] = '{"type":"Wap","wap_url": "http://www.baidu.com","wap_name": "baidu"}';    // 支付场景 
        // 结束
        $arr['sign_type'] = 1;                                      // 签名类型(1md5)
        $arr['app_no'] = $pay_config['app_id'];                     // 应用id
        $arr['pay_type'] = 1;                                       // 返回image参数类型，默认值1 返回图片地址，2返回图片数据串，3返回支付地址

        ksort($arr);
        $key = $pay_config['key'];                                  // 密钥
        $arr['sign'] = md5(urldecode(http_build_query($arr) . '&key=' . $key));    // 签名,urldecode解码已编码的 URL 字符串(原始值)
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['image']) && strlen($resarray['data']['image']) > 10) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 三通付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function threelinkVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchant_no'] = $pay_config['merchant_id'];
        $arr['trade_no'] = $order_id;
        $arr['sign_type'] = 1;

        ksort($arr);
        $key = $pay_config['key'];                                                     // 密钥
        $arr['sign'] = md5(urldecode(http_build_query($arr) . '&key=' . $key));        // 签名,urldecode解码已编码的 URL 字符串(原始值)
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            if (isset($resarray['data']['status']) && $resarray['data']['status'] == 1) {
                // 支付成功，说明： 支付好像做了主从数据库读写分离，可能回调查询时，第一次显示未支付。
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 微互宝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function weihupay($parameters = [], $pay_config = [])
    {
        /*
          支付类型
          微信 WAP：pay.weixin.wap
          微信原生H5：pay.weixin.h5
          微信扫码支付：pay.weixin.qrcode
          微信公众号支付：pay.weixin.js
          微信 SDK 支付：pay.weixin.sdk
          支付宝 WAP：pay.alipay.wap
          支付宝原生H5：pay.alipay.h5
          支付宝扫码支付：pay.alipay.qrcode
          支付宝 SDK 支付：pay.alipay.sdk
          QQ扫码支付：pay.qq.qrcode
          QQ WAP：pay. qq.wap
          QQ SDK 支付：pay.qq.sdk
          银联 SDK 支付：pay.uni.sdk
          银联扫码支付：pay.uni.qrcode
          银联 WAP支付：pay.uni.wap
          银联快捷支付：pay.uni.quickpay
          银联网关支付：pay.uni.gateway
         */
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'pay.weixin.h5';
                break;
            case 'alipay_h5':
                $type = 'pay.alipay.wap';
                break;
            case 'alipay_scan_code':
                $type = 'pay.alipay.wap';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['mchid'] = $pay_config['merchant_id'];                      // 由我司分配商户号
        $arr['paytype'] = $type;                                         // 支付类型 
        $arr['time'] = date('YmdHis');                                   // 订单生成的时间，格式：yyyyMMddHHmmss，
        $arr['amount'] = intval(strval($parameters['cash'] * 100));      // 总金额，单位：分 
        $arr['out_tradeid'] = $parameters['order_id'];                   // 商户系统订单号
        $arr['subject'] = $parameters['body'];                     // 商品描述
        $arr['attach'] = date('YmdHis') . rand(100000, 999999);          // 附加信息
        $arr['clientip'] = $parameters['ip'];                            // 支付用户的终端ip
        $arr['version'] = '1.0';                                         // 版本号：1.0
        $arr['mobile'] = '';                                             // 手机号，仅在快捷支付时候需要使用
        $arr['name'] = '';                                               // 持卡人姓名,仅在快捷支付时候使用
        $arr['idcardno'] = '';                                           // 持卡人身份证号码,仅在快捷支付时候使用
        $arr['submchid'] = '';                                           // 子商户号，大商户下的子商户
        $arr['returnurl'] = $parameters['return_url'];                   // 前端支付成功的跳转地址
        $arr['notifyurl'] = $pay_config['notify_url'];                   // 异步接收支付结果
        $sign = $arr['paytype'] . $arr['mchid'] . $arr['amount'] . $arr['out_tradeid'] . $arr['time'] . $pay_config['key'];
        $arr['sign'] = md5($sign);

        $request_url = $pay_config['request_url'];                       // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_info']) && strlen($resarray['pay_info']) > 20) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 微互宝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function weihupayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        $arr['mchid'] = $pay_config['merchant_id'];                      // 由我司分配商户号
        $arr['paytype'] = 'pay.alipay.wap';                              // 支付类型 
        $arr['time'] = date('YmdHis');                                   // 订单生成的时间，格式：yyyyMMddHHmmss，
        $arr['amount'] = 1000;                                           // 总金额，单位：分 
        $arr['out_tradeid'] = $order_id;                                 // 商户系统订单号
        $arr['subject'] = '123456';                                      // 商品描述
        $arr['attach'] = '123456';                                       // 附加信息
        $arr['clientip'] = '8.8.8.8';                                    // 支付用户的终端ip
        $arr['version'] = '1.0';                                         // 版本号：1.0
        $arr['mobile'] = '';                                             // 手机号，仅在快捷支付时候需要使用
        $arr['name'] = '';                                               // 持卡人姓名,仅在快捷支付时候使用
        $arr['idcardno'] = '';                                           // 持卡人身份证号码,仅在快捷支付时候使用
        $arr['submchid'] = '';                                           // 子商户号，大商户下的子商户
        $arr['returnurl'] = $pay_config['return_url'];                   // 前端支付成功的跳转地址
        $arr['notifyurl'] = $pay_config['notify_url'];                   // 异步接收支付结果
        $sign = $arr['paytype'] . $arr['mchid'] . $arr['amount'] . $arr['out_tradeid'] . $arr['time'] . $pay_config['key'];
        $arr['sign'] = md5($sign);

        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_result']) && $resarray['pay_result'] == '0') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          pay_result 是 String 支付结果：0－成功；其它－失败
         */
    }

    /**
     * 优付支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function youfu($parameters = [], $pay_config = [])
    {
        /*
          支付方式：
          1微信公众号
          2微信扫码
          3微信H5
          4支付宝扫码
          5 WAP快捷
          6无卡快捷
          7QQ H5
          8QQ扫码
          9银联扫码
          10网银B2B
          11网银B2C
          12微信app
          13支付宝H5
          14京东扫码
          15 苏宁扫码
          16 支付宝PC
          17 微信刷卡
         */
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = '3';
                break;
            case 'alipay_h5':
                $type = '13';
                break;
            case 'alipay_scan_code':
                $type = '13';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merchantNo'] = $pay_config['merchant_id'];                   // 必填 商户号
        $arr['orderAmount'] = intval(strval($parameters['cash'] * 100));   // 必填 商户订单金额，单位分格式：10000=100元
        $arr['orderNo'] = $parameters['order_id'];                         // 必填 商户订单号-随机生成
        $arr['notifyUrl'] = $pay_config['notify_url'];                     // 必填 异步通知：服务器端处理通知接口格式
        $arr['callbackUrl'] = $pay_config['return_url'];                   // 必填 页面回调：支付成功后会向该地址发送通知，该地址可以带参数,注意：如不填callbackUrl的参数值支付成功后您的浏览器页面将得不到支付成功的通知
        $arr['payType'] = $type;                                           // 必填 支付方式：1 微信公众号 2 微信扫码 3 微信H5 4 支付宝扫码
        $arr['productName'] = $parameters['body'];                   // 非必填 商品名称
        $arr['productDesc'] = $parameters['body'];                   // 非必填 商品描述
        $arr['remark'] = date('YmdHis') . rand(100000, 999999);            // 非必填 备注
        $arr['ip'] = $parameters['ip'];                                    // 非必填 获取用户IP
        $arr['accountName'] = '';                                          // 非必填 payType=6快捷支付必填，持卡人姓名
        $arr['accountNo'] = '';                                            // 非必填 payType=6快捷支付必填，银行卡号
        $arr['idCardNo'] = '';                                             // 非必填 payType=6快捷支付必填，身份证号
        $arr['phone'] = '';                                                // 非必填 payType=6快捷支付必填，手机号
        $arr['openid'] = '';                                               // 非必填 payType=1微信公众号支付时必传
        $arr['settleType'] = '';                                           // 非必填 默认D0，T1表示下一个工作日结算
        $arr['payTypeConfig'] = '';                                        // 非必填 默认QUICKA，QUICKA通道11-22点到账，QUICKB通道24小时到账支持更多卡种
        $arr['deviceType'] = '';                                           // 非必填 payType=1/3/7/13 时必填是必填，01Android 02ios
        $arr['mchAppId'] = '';                                             // 非必填 payType=1/3/7/13 时必填，payType=1 时，是发起交易的公众号或者对应小程序的 APPIDpayType=3/5 时 ，应用唯一标识 ，如com.tencent.qq
        $arr['mchAppName'] = '';                                           // 非必填 payType=1/3/7/13 时必填，应用名称

        $arr = array_filter($arr);
        ksort($arr);
        $string = urldecode(http_build_query($arr));
        $string = md5($string . $pay_config['key']);
        $arr['sign'] = $string;

        $data = json_encode($arr);
        $header = array('Content-Type: application/json');

        $request_url = $pay_config['request_url'];                         // 请求地址
        $resdata = go_curl($request_url, $data, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payUrl']) && strlen($resarray['payUrl']) > 20) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 优付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function youfuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchantNo'] = $pay_config['merchant_id'];
        $arr['orderNo'] = $order_id;

        ksort($arr);
        $string = urldecode(http_build_query($arr));
        $string = md5($string . $pay_config['key']);
        $arr['sign'] = $string;

        $data = json_encode($arr);
        $header = array('Content-Type: application/json');
        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, $data, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['orderStatus']) && $resarray['orderStatus'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          初始化INIT,
          取消CANCEL,
          成功SUCCESS,
          失败FAILED,
          退款REFUND;
         */
    }

    /**
     * super支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function superpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                break;
            case 'alipay_scan_code':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $parameters['order_id'];         // 必填 订单号
        $arr['title'] = $parameters['body'];         // 非必填 标题
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['money'] = $parameters['cash'];               // 订单金额
        $arr['noticeUrl'] = $pay_config['notify_url'];     // 非必填 通知地址，为空时不回调
        $arr['dumpUrl'] = $pay_config['notify_url'];       // 非必填 支付成功跳转连接，跳转时没有参数请自行拼接完成，不使用收银台或自有收银台时可以不传该参数
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['money'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url'];         // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['qrCode']) && strlen($resarray['data']['qrCode']) > 20) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * super支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function superpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $order_id;                       // 必填 订单号
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == '已支付') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 超人支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function chaoren($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                break;
            case 'alipay_scan_code':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $parameters['order_id'];         // 必填 订单号
        $arr['title'] = $parameters['body'];         // 非必填 标题
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['money'] = $parameters['cash'];               // 订单金额
        $arr['noticeUrl'] = $pay_config['notify_url'];     // 非必填 通知地址，为空时不回调
        $arr['dumpUrl'] = $pay_config['notify_url'];       // 非必填 支付成功跳转连接，跳转时没有参数请自行拼接完成，不使用收银台或自有收银台时可以不传该参数
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['money'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url'];         // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['qrCode']) && strlen($resarray['data']['qrCode']) > 20) {

            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 超人支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function chaorenVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $order_id;                       // 必填 订单号
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == '已支付') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          未支付/已支付
         */
    }

    /**
     * 超人二支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function chaorentwo($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                break;
            case 'alipay_scan_code':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $parameters['order_id'];         // 必填 订单号
        $arr['title'] = $parameters['body'];         // 非必填 标题
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['money'] = $parameters['cash'];               // 订单金额
        $arr['noticeUrl'] = $pay_config['notify_url'];     // 非必填 通知地址，为空时不回调
        $arr['dumpUrl'] = $pay_config['notify_url'];       // 非必填 支付成功跳转连接，跳转时没有参数请自行拼接完成，不使用收银台或自有收银台时可以不传该参数
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['money'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url'];         // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['qrCode']) && strlen($resarray['data']['qrCode']) > 20) {

            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 超人二支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function chaorentwoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appId'] = $pay_config['merchant_id'];        // 必填 商户号
        $arr['orderNo'] = $order_id;                       // 必填 订单号
        $arr['timestamp'] = time() . '000';                // 必填 时间戳（毫秒）
        $arr['sign'] = md5($arr['appId'] . '^' . $arr['orderNo'] . '^' . $arr['timestamp'] . '^' . $pay_config['key']);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url_query'];                 // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == '已支付') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          未支付/已支付
         */
    }

    /**
     * 白菜支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function baicai($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'CHANNEL_TYPE_ZFB';
                break;
            case 'alipay_scan_code':
                $type = 'CHANNEL_TYPE_ZFB';
                break;
            case 'wechat_scan_code':
                $type = 'CHANNEL_TYPE_WX';
                break;
            case 'unionpay_scan_code':
                $type = 'CHANNEL_TYPE_YSF';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['spId'] = $pay_config['merchant_id'];                  // 必填 商户id，由白菜收款平台分配
        $arr['channelType'] = $type;                                // 必填 支付宝通道：CHANNEL_TYPE_ZFB  微信通道: CHANNEL_TYPE_WX(暂未开放)
        $arr['amount'] = intval(strval($parameters['cash'] * 100)); // 必填 金额。整数。单位:分
        $arr['spTradeId'] = $parameters['order_id'];                // 必填 商户系统订单号，该订单号将作为白菜收款的返回数据。该值需在商户系统内唯一
        $arr['callbackUrl'] = $pay_config['notify_url'];            // 必填 下行异步通知过程的返回地址，必须是有效网址，且不带参数
        $arr['usage'] = '';                                         // 非必填 用法类型，可空
        $arr = array_filter($arr);                                  // 去除空字符
        ksort($arr);
        $string = implode('|', $arr);
        $string .= '|' . $pay_config['key'];
        $arr['sign'] = hash('sha256', $string);
        $header = array('Content-Type: application/x-www-form-urlencoded');

        $request_url = $pay_config['request_url'];                  // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payPageUrl']) && strlen($resarray['data']['payPageUrl']) > 20) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 白菜支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function baicaiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        // 请求参数
        $arr['spId'] = $pay_config['merchant_id'];           // 必填 商户id，由白菜收款平台分配
        $arr['bcTradeId'] = input('bcTradeId');              // 必填 白菜系统订单号
        $arr['spTradeId'] = input('spTradeId');              // 必填 商户订单号

        $string = $arr['spId'] . '|' . $arr['bcTradeId'] . '|' . $arr['spTradeId'] . '|' . $pay_config['key'];
        $arr['sign'] = hash('sha256', $string);

        $header = array('Content-Type: application/x-www-form-urlencoded');
        $request_url = $pay_config['request_url_query'];     // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['tradeState']) && $resarray['data']['tradeState'] == 'TRADE_STATE_END1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 通宝付支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function paytbf($parameters = [], $pay_config = [])
    {
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'weixinH5';
                break;
            case 'alipay_h5':
                $type = 'aliPayH5';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['bank_code'] = 'CMS';                                 // 银行编码
        $arr['merchant_code'] = $pay_config['merchant_id'];        // 商户号
        $arr['merchant_order'] = $parameters['order_id'];          // 商户号订单号
        $arr['input_charset'] = 'utf-8';                           // 编码格式
        $arr['return_url'] = $pay_config['return_url'];            // 商户号返回地址
        $arr['notify_url'] = $pay_config['notify_url'];            // 商户号通知地址
        $arr['trans_amount'] = intval(strval($parameters['cash'] * 100));          // 充值金额,单位为分
        $arr['type'] = $type;                                      // 支付类型
        $arr['goods_info'] = $parameters['body'];            // 商品名称
        $arr['buyer_ip'] = $parameters['ip'];                      // 客户端ip

        ksort($arr);
        $key = $pay_config['key'];
        $str = urldecode(http_build_query($arr));
        $arr['sign'] = md5($str . '&key=' . $key);

        $request_url = $pay_config['request_url'];                 // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['respCode']) && $resarray['respCode'] == 'SUCCESS') {
            // 成功     
            $verify_param = $resarray['respData']['out_trade_no'];
            $url = $resarray['respData']['mweb_url'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 通宝付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function paytbfVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];

        $arr['merchant_code'] = $pay_config['merchant_id'];      // 商户号
        $arr['merchant_order'] = $order_id;                      // 商户订单号

        $str = urldecode(http_build_query($arr));
        $sign = md5($str . '&key=' . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $url = $request_url . '?' . $str . '&sign=' . $sign;

        $resdata = go_curl($url, '', 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_status']) && $resarray['pay_status'] == 2) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status=2    —支付成功
         */
    }

    /**
     * 恒闪通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function hengshantong($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay_h5';
                break;
            case 'alipay_scan_code':
                $type = 'alipay_scan_code';
                break;
            case 'wechat_h5':
                $type = 'wechat_h5';
                break;
            case 'wechat_scan_code':
                $type = 'wechat_scan_code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['bank_code'] = 'CMS';                            // 银行编码
        $arr['merchant_code'] = $pay_config['merchant_id'];   // 商户号
        $arr['merchant_order'] = $parameters['order_id'];     // 商户订单号
        $arr['input_charset'] = 'utf-8';                      // 编码格式
        $arr['return_url'] = $parameters['tj_return_url'];    // 跳转地址
        $arr['notify_url'] = $pay_config['notify_url'];       // 通知地址
        $arr['trans_amount'] = $parameters['cash'] * 100;     // 充值金额,单位为分
        $arr['pay_type'] = $type;
        $arr['goods_info'] = $parameters['order_id'];
        $arr['buyer_ip'] = $parameters['ip'];
        $arr['return_params'] = '123';
        $arr['extra'] = '456';

        ksort($arr);
        $str = urldecode(http_build_query($arr));
        $arr['sign'] = md5($str . '&key=' . $pay_config['key']);

        $request_url = $pay_config['request_url'];            // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['url_info']) && strlen($resarray['data']['url_info']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 恒闪通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function hengshantongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchant_code'] = $pay_config['merchant_id'];      // 商户号
        $arr['merchant_order'] = $order_id;                      // 商户订单号

        $str = urldecode(http_build_query($arr));

        $arr['sign'] = md5($str . '&key=' . $pay_config['key']);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', 3);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['order_status']) && $resarray['data']['order_status'] == 'success') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 银牛星支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function hfnbuy($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wechat_h5';
                break;
            case 'alipay_h5':
                $type = 'alipay_h5';
                break;
            case 'wechat_scan_code':
                $type = 'wechat_scan_code';
                break;
            case 'alipay_scan_code':
                $type = 'alipay_js';
                break;
            case 'qq_h5':
                $type = 'qq_h5';
                break;
            case 'kuaijie':
                $type = 'kuaijie';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        $other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";

        $private_key = openssl_pkey_get_private($key);
        $public_key = openssl_pkey_get_public($other_public_key);

        $head = [
            'charset' => '00',
            'version' => 'V1.1.0',
            'merchantNumber' => $pay_config['merchant_id'],
            'tradeType' => 'payInterface',
            'requestTime' => date("YmdHis"),
            'signType' => 'RSA',
            'sign' => '',
        ];

        $context = [
            'merchant_code' => $pay_config['merchant_id'], // 商户号
            'merchant_order' => $parameters['order_id'], // 商户号订单号
            'input_charset' => 'utf-8', // 编码格式
            'return_url' => $pay_config['return_url'], // 商户号返回地址
            'notify_url' => $pay_config['notify_url'], // 商户号通知地址
            'trans_amount' => intval(strval($parameters['cash'] * 100)), // 充值金额,单位为分
            'pay_type' => $type, // 支付类型
            'goods_info' => $parameters['body'], // 商品名称
            'buyer_ip' => $parameters['ip'], // 客户端ip
            'return_params' => $pay_config['merchant_id'], // 返回参数预留备注
            'extra' => $parameters['order_id'], // 预留备注
        ];

        ksort($context);
        $json_context = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        openssl_sign($json_context, $sign, $private_key, OPENSSL_ALGO_MD5); // 根据提供的私钥进行订单签名

        $sign = base64_encode($sign);    // 最终的签名　
        $head['sign'] = $sign;           // 将签名加入businessHead中

        $arr['businessContext'] = $context;
        $arr['businessHead'] = $head;

        $json_arr = json_encode($arr);

        $encrypt = '';
        foreach (str_split($json_arr, 117) as $chunk) {
            openssl_public_encrypt($chunk, $encrypt_data, $public_key);
            $encrypt .= $encrypt_data;
        }

        $postData['merchant_code'] = $pay_config['merchant_id'];
        $postData['context'] = base64_encode($encrypt);

        //$url = $pay_config['request_url'] . '?' . 'merchant_code' . '=' . $pay_config['merchant_id'] . '&context=' . urlencode($postData['context']);
        $url = $pay_config['request_url'];
        $resdata = go_curl($url, $postData, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);

        if (isset($resarray['message']['code']) && $resarray['message']['code'] == '200') {

            $data = $resarray['context']; // 将收到的密文提取出来

            $decrypt = '';
            $decrypts = base64_decode($data);
            foreach (str_split($decrypts, 128) as $chunk) {
                openssl_private_decrypt($chunk, $decrypt_data, $private_key);
                $decrypt .= $decrypt_data;
            }

            $context_arr = json_decode($decrypt, true); // 转为数组格式        
            // 成功     
            $verify_param = $context_arr['businessContext']['out_trade_no'];
            $url = $context_arr['businessContext']['url_info'];
            return ['code' => 200, 'msg' => substr($decrypt, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        if (isset($decrypt)) {
            $resdata = $decrypt;
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 银牛星支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function hfnbuyVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        $other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";

        $private_key = openssl_pkey_get_private($key);
        $public_key = openssl_pkey_get_public($other_public_key);

        $head = [
            'charset' => '00',
            'version' => 'V1.1.0',
            'merchantNumber' => $pay_config['merchant_id'],
            'tradeType' => 'queryInterface',
            'requestTime' => date("YmdHis"),
            'signType' => 'RSA',
            'sign' => '',
        ];

        $context = [
            'merchant_code' => $pay_config['merchant_id'], // 商户号
            //'merchant_order' => '201807271119588584', // 商户号订单号
            'out_trade_no' => $order_id, // 第三方订单号
        ];

        ksort($context);
        $json_context = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        openssl_sign($json_context, $sign, $private_key, OPENSSL_ALGO_MD5); // 根据提供的私钥进行订单签名

        $sign = base64_encode($sign);    // 最终的签名　
        $head['sign'] = $sign;           // 将签名加入businessHead中

        $arr['businessContext'] = $context;
        $arr['businessHead'] = $head;

        $json_arr = json_encode($arr);

        $encrypt = '';
        foreach (str_split($json_arr, 117) as $chunk) {
            openssl_public_encrypt($chunk, $encrypt_data, $public_key);
            $encrypt .= $encrypt_data;
        }

        $postData['merchant_code'] = $pay_config['merchant_id'];
        $postData['context'] = base64_encode($encrypt);

        //$url = $pay_config['request_url'] . '?' . 'merchant_code' . '=' . $pay_config['merchant_id'] . '&context=' . urlencode($postData['context']);
        $url = $pay_config['request_url_query'];
        $resdata = go_curl($url, $postData, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);

        if (isset($resarray['message']['code']) && $resarray['message']['code'] == '200') {

            $data = $resarray['context']; // 将收到的密文提取出来

            $decrypt = '';
            $decrypts = base64_decode($data);
            foreach (str_split($decrypts, 128) as $chunk) {
                openssl_private_decrypt($chunk, $decrypt_data, $private_key);
                $decrypt .= $decrypt_data;
            }

            $context_arr = json_decode($decrypt, true); // 转为数组格式    
            // 成功                 
            if (strtoupper($context_arr['businessContext']['order_status']) == 'SUCCESS') {
                return ['code' => 200, 'msg' => substr($decrypt, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        if (isset($decrypt)) {
            $resdata = $decrypt;
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 小强支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function xiaoqiang($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'M10020';
                break;
            case 'alipay_h5':
                $type = 'M10020';
                break;
            case 'wechat_scan_code':
                $type = 'M10010';
                break;
            case 'alipay_scan_code':
                $type = 'M10010';
                break;
            case 'kuaijie':
                $type = 'M10030';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $request = [
            'customerNo' => $pay_config['merchant_id'], // 会员号
            'customerName' => $pay_config['app_id'], // 会员名称
            'cusOrderNo' => $parameters['order_id'], // 会员订单号（会员系统唯一）
            'payType' => 20, // 10微信、20支付宝、30云闪付、35qq钱包
            'orderTitle' => $parameters['body'], // 订单标题
            'payAmt' => intval(strval($parameters['cash'] * 100)), // 订单金额（单位：分）
            'userIp' => $parameters['ip'], // 用户发起支付时的IP
            'userNo' => '', // 发起支付的用户唯一标识
            'termType' => 10, // 10移动端、20PC端
            'isQrCode' => 100, // 100是、-100否 100时返回展示二维码页面，我方已生成二维码  -100时返回生成二维码的链接，由客户自己生成二维码
            'channelCode' => '', //  
            'callbackUrl' => $parameters['tj_return_url'], // 前台页面支付完成后调转地址
            'notifyUrl' => $pay_config['notify_url'], // 传递则按此地址进行结果通知，不传递则按配置地址通知
            'extrasContent' => 123, // 预留字段JSON（格式如 {“appId”:”123456”}）,没有则不传，不可为空字符串
        ];

        $data = array_filter($request);
        ksort($data);
        $string = http_build_query($data) . $pay_config['key'];
        $sign = md5(urldecode($string));

        $head_data['trxCode'] = $type;
        $head_data['version'] = '01';
        $head_data['reqSn'] = $pay_config['merchant_id'] . date('YmdHis') . rand(100000, 999999);
        $head_data['timestamp'] = date("YmdHis");
        $head_data['signedMsg'] = $sign;
        $head_data['customerNo'] = $pay_config['merchant_id'];

        $arr = [
            'head' => $head_data,
            'request' => $data,
        ];

        $json_arr = json_encode($arr);

        $header = [
            "Content-Type: application/json",
            "customerNo:{$pay_config['merchant_id']}",
        ];

        $url = $pay_config['request_url'];
        $resdata = go_curl($url, $json_arr, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode(json_decode($resdata, true), true);

        if (isset($resarray['response']['payInfo']) && strlen($resarray['response']['payInfo']) > 20) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 小强支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function xiaoqiangVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $a = substr($order_id, 0, 2);
        $b = substr($order_id, 2, 2);
        $c = substr($order_id, 4, 2);
        $request = [
            'customerNo' => $pay_config['merchant_id'], // 会员号
            'tradeDate' => '20' . $a . '-' . $b . '-' . $c, // 下单日期
            'cusOrderNo' => $order_id, // 会员订单号（会员系统唯一）
        ];

        $data = array_filter($request);
        ksort($data);
        $string = http_build_query($data) . $pay_config['key'];
        $sign = md5(urldecode($string));

        $head_data['trxCode'] = 'M30010';
        $head_data['version'] = '01';
        $head_data['reqSn'] = $pay_config['merchant_id'] . date('YmdHis') . rand(100000, 999999);
        $head_data['timestamp'] = date("YmdHis");
        $head_data['signedMsg'] = $sign;
        $head_data['customerNo'] = $pay_config['merchant_id']; // 会员号 

        $arr = [
            'head' => $head_data,
            'request' => $data,
        ];

        $json_arr = json_encode($arr);

        $header = [
            "Content-Type: application/json",
            "customerNo:{$pay_config['merchant_id']}",
        ];

        $url = $pay_config['request_url_query'];
        $resdata = go_curl($url, $json_arr, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode(json_decode($resdata, true), true);

        if (isset($resarray['response']['status']) && $resarray['response']['status'] == 100) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }

        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        // 交易状态 10-待支付，50-支付中、100-交易成功，-100-交易失败
    }

    /**
     * 封装杉德支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function sandpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $route = '/qr/api/order/create';
                $method = 'sandpay.trade.precreate';
                $id = '00000006';
                break;
            case 'alipay_scan_code':
                $route = '/qr/api/order/create';
                $method = 'sandpay.trade.precreate';
                $id = '00000006';
                break;
            case 'wechat_h5':
                $route = '/qr/api/order/create';
                $method = 'sandpay.trade.precreate';
                $id = '00000006';
                break;
            case 'wechat_scan_code':
                $route = '/qr/api/order/create';
                $method = 'sandpay.trade.precreate';
                $id = '00000006';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $domain_url = $pay_config['other_one'] ? $pay_config['other_one'] : '';

        $pub_key_path = Env::get('root_path') . 'cert' . DIRECTORY_SEPARATOR . 'sandpay' . DIRECTORY_SEPARATOR . $pay_config['merchant_id'] . '.cer'; // 公钥文件 这里是官网下载的杉德公钥
        $pri_key_path = Env::get('root_path') . 'cert' . DIRECTORY_SEPARATOR . 'sandpay' . DIRECTORY_SEPARATOR . $pay_config['merchant_id'] . '.pfx'; // 本地浏览器导出的私钥文件
        $cert_pwd = $pay_config['key'];    // 私钥证书密码
        $cash = $parameters['cash'] * 100;

        $data['head']['version'] = '1.0';                                        // 版本号  默认1.0
        $data['head']['method'] = $method;                                       // 接口名称 参考各接口文档中"请求地址-method"
        $data['head']['productId'] = $id;                                        // 产品编码 杉德宝00001000
        $data['head']['accessType'] = '1';                                       // 接入类型  1-普通商户接入 2-平台商户接入
        $data['head']['mid'] = $pay_config['merchant_id'];                       // 商户ID  收款方商户号
        $data['head']['plMid'] = '';                                             // 平台ID  接入类型为2时必填，在担保支付模式下填写核心商户号；在杉德宝平台终端模式下填写平台商户号
        $data['head']['channelType'] = '08';                                     // 渠道类型  商户的真实应用场景，可选项包括：07-互联网 08-移动端
        $data['head']['reqTime'] = date('YmdHis');                               // 请求时间  格式：yyyyMMddHHmmss

        $data['body']['payTool'] = '0401';                                       // 支付工具  支付宝扫码：0401 微信扫码：0402 聚合码：0403 杉德宝扫码：0404
        $data['body']['orderCode'] = $parameters['order_id'];                    // 商户订单号  长度12位起步，商户唯一，建议订单号有日期
        $data['body']['limitPay'] = '';                                          // 限定支付方式  默认为空  送1-限定不能使用贷记卡  送4-限定不能使用花呗  送5-限定不能使用贷记卡+花呗
        $data['body']['totalAmount'] = str_pad($cash, 12, '0', STR_PAD_LEFT);    // 订单金额  例 000000000101 代表 1.01 元
        $data['body']['subject'] = $parameters['order_id'];                      // 订单标题
        $data['body']['body'] = $parameters['order_id'];                         // 订单描述  订单信息详细描述，JSON格式：
        $data['body']['txnTimeOut'] = date('YmdHis', time() + 60);               // 订单超时时间  格式：yyyyMMddHHmmss 默认120分钟内有效，自商户提交支付开始计算，建议传送。
        $data['body']['notifyUrl'] = $pay_config['other_two'] ? $pay_config['other_two'] : $pay_config['notify_url']; // 异步通知地址
        $data['body']['frontUrl'] = $this->returnUrl($parameters['order_id'], $domain_url);  // 前台通知地址
        $data['body']['storeId'] = '';                                           // 商户门店编号
        $data['body']['terminalId'] = '';                                        // 商户终端编号
        $data['body']['operatorId'] = '';                                        // 操作员编号
        $data['body']['clearCycle'] = '3';                                       // 清算模式  0-T1(默认)  1-T0  2-D0  3-D1（只限于杉德宝商户）
        $data['body']['riskRateInfo'] = '';                                      // 风控信息域
        $data['body']['bizExtendParams'] = '';                                   // 业务扩展参数
        $data['body']['merchExtendParams'] = '';                                 // 商户扩展参数
        $data['body']['extend'] = $parameters['verify_param'];                   // 扩展域
        $data['body']['accsplitInfo'] = '';                                      // 分账域  如需分账，上送分账标识 "accsplitInfo":{"accsplitMode":"3"}
        $data['body']['hbFqFlag'] = '';                                          // 花呗分期标识  0-不支持花呗分期(默认)  1-支持花呗分期  2-只能使用花呗分期
        $data['body']['hbFqNum'] = '';                                           // 花呗分期期数  花呗分期标识为2时必填  花呗分期期数支持3、6、12
        $data['body']['hbFqSellerPercent'] = '';                                 // 卖家承担手续费比例  花呗分期标识为2时必填  暂时只支持0

        $file = file_get_contents($pri_key_path);
        openssl_pkcs12_read($file, $cert, $cert_pwd);
        $prikey = $cert['pkey'];

        $plainText = json_encode($data);

        $resource = openssl_pkey_get_private($prikey);
        openssl_sign($plainText, $sign, $resource);

        $sign = base64_encode($sign);

        $arr = [
            'charset' => 'utf-8',
            'signType' => '01',
            'data' => json_encode($data),
            'sign' => urlencode($sign)
        ];

        $param = http_build_query($arr);
        $header = array('Content-Type: application/x-www-form-urlencoded');

        $request_url = $pay_config['request_url'] . $route;
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second'], $header);

        if (!$resdata) {
            return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        // 解析数据
        $response = urldecode($resdata);
        $arrStr = explode('&', $response);
        foreach ($arrStr as $str) {
            $p = strpos($str, "=");
            $key = substr($str, 0, $p);
            $value = substr($str, $p + 1);
            $data_arr[$key] = $value;
        }

        $resarray = json_decode($data_arr['data'], true);

        if (isset($resarray['body']['qrCode']) && strlen($resarray['body']['qrCode']) > 20) {
            return ['code' => 200, 'msg' => substr($data_arr['data'], 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($data_arr['data'], 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 杉德支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function sandpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        switch ($recharge['type']) {
            case 'alipay_h5':
                $route = '/gw/api/order/query';
                $method = 'sandpay.trade.query';
                $id = '00002000';
                break;
            case 'alipay_scan_code':
                $route = '/gw/api/order/query';
                $method = 'sandpay.trade.query';
                $id = '00002000';
                break;
            case 'wechat_h5':
                $route = '/gw/api/order/query';
                $method = 'sandpay.trade.query';
                $id = '00002000';
                break;
            case 'wechat_scan_code':
                $route = '/gw/api/order/query';
                $method = 'sandpay.trade.query';
                $id = '00002000';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $pub_key_path = Env::get('root_path') . 'cert' . DIRECTORY_SEPARATOR . 'sandpay' . DIRECTORY_SEPARATOR . $pay_config['merchant_id'] . '.cer'; // 公钥文件 这里是官网下载的杉德公钥
        $pri_key_path = Env::get('root_path') . 'cert' . DIRECTORY_SEPARATOR . 'sandpay' . DIRECTORY_SEPARATOR . $pay_config['merchant_id'] . '.pfx'; // 本地浏览器导出的私钥文件
        $cert_pwd = $pay_config['key'];    // 私钥证书密码

        $data['head']['version'] = '1.0';                                        // 版本号  默认1.0
        $data['head']['method'] = $method;                                       // 接口名称 参考各接口文档中"请求地址-method"
        $data['head']['productId'] = $id;                                        // 产品编码 杉德宝00001000
        $data['head']['accessType'] = '1';                                       // 接入类型  1-普通商户接入 2-平台商户接入
        $data['head']['mid'] = $pay_config['merchant_id'];                       // 商户ID  收款方商户号
        $data['head']['plMid'] = '';                                             // 平台ID  接入类型为2时必填，在担保支付模式下填写核心商户号；在杉德宝平台终端模式下填写平台商户号
        $data['head']['channelType'] = '08';                                     // 渠道类型  商户的真实应用场景，可选项包括：07-互联网 08-移动端
        $data['head']['reqTime'] = date('YmdHis');                               // 请求时间  格式：yyyyMMddHHmmss

        $data['body']['orderCode'] = $order_id;                                  // 商户订单号  长度12位起步，商户唯一，建议订单号有日期

        $file = file_get_contents($pri_key_path);
        openssl_pkcs12_read($file, $cert, $cert_pwd);
        $prikey = $cert['pkey'];

        $plainText = json_encode($data);

        $resource = openssl_pkey_get_private($prikey);
        openssl_sign($plainText, $sign, $resource);

        $sign = base64_encode($sign);

        $arr = [
            'charset' => 'utf-8',
            'signType' => '01',
            'data' => json_encode($data),
            'sign' => urlencode($sign)
        ];

        $param = http_build_query($arr);
        $header = array('Content-Type: application/x-www-form-urlencoded');

        $request_url = $pay_config['request_url'] . $route;
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second'], $header);
        // 解析数据
        $response = urldecode($resdata);
        $arrStr = explode('&', $response);
        foreach ($arrStr as $str) {
            $p = strpos($str, "=");
            $key = substr($str, 0, $p);
            $value = substr($str, $p + 1);
            $data_arr[$key] = $value;
        }
        $file = file_get_contents($pub_key_path);
        $cert = chunk_split(base64_encode($file), 64, "\n");
        $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n";

        $res = openssl_pkey_get_public($cert);
        $detail = openssl_pkey_get_details($res);

        $pubkey = $detail['key'];
        $resource = openssl_pkey_get_public($pubkey);
        $result = openssl_verify($data_arr['data'], base64_decode($data_arr['sign']), $resource);

        $resarray = json_decode($data_arr['data'], true);
        if (isset($resarray['body']['orderStatus']) && $resarray['body']['orderStatus'] == '00') {
            return ['code' => 200, 'msg' => substr($data_arr['data'], 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($data_arr['data'], 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 北付宝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function beifubao($parameters = [], $pay_config = [])
    {

        /*
          微信反扫		WECHAT_SCAN
          微信正扫		WECHAT_NATIVE
          微信公众号支付	WECHAT_JSAPI
          微信H5		WECHAT_H5
          支付宝反扫		ALI_SCAN
          支付宝正扫		ALI_NATIVE
          支付宝H5		ALI_H5
         */
        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 'WECHAT_JSAPI';
                break;
            case 'alipay_h5':
                $type = 'ALI_H5';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        $other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";

        $private_key = openssl_pkey_get_private($key);
        $public_key = openssl_pkey_get_public($other_public_key);

        $head = [
            'charset' => 'utf-8', // 字符集
            'version' => '1.0', // 版本号
            'method' => 'UNIFIED_PAYMENT', // 请求接口名称
            'memberNumber' => $pay_config['merchant_id'], // 会员编号
            'requestTime' => date('Ymdhms'), // 请求时间
            'signType' => 'RSA', // 签名类型
            'sign' => '', // 签名信息
        ];

        $context = [
            'defrayalType' => $type, // 支付方式
            'memberOrderNumber' => $parameters['order_id'], // 商户请求支付的订单号
            'tradeCheckCycle' => 'T1', // 结算周期 T1,D0 暂时只支持T1
            'orderTime' => date('Ymdhms'), // 订单时间
            'currenciesType' => 'CNY', // 币种
            'tradeAmount' => intval(strval($parameters['cash'] * 100)), // 交易金额,以分为单位
            'commodityBody' => $parameters['body'], // 商品信息
            'commodityDetail' => $parameters['body'], // 商品详情
            'commodityRemark' => $parameters['body'], // 商品备注
            'notifyUrl' => $pay_config['notify_url'], // 商户接收异步通知的地址
            'returnUrl' => $parameters['return_url'], // 支付完成后跳转
            'terminalIP' => $parameters['ip'], // 付款设备或发起请求的服务的IP地址
            'terminalId' => 'terminalId', // 付款设备的ID编号
            'userId' => 'userId', // 当交易方式为反扫时，必填
            'attach' => $parameters['order_id'], // 交易备注信息
            'remark' => $parameters['order_id'], // 商户可自行设置附加信息，订单查询会原值返回
        ];
        ksort($context);

        $json_context = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        openssl_sign($json_context, $sign, $private_key, OPENSSL_ALGO_MD5);    // MD5方式 使用商户私钥进行签名
        $sign = base64_encode($sign);    // 最终的签名
        $head['sign'] = $sign;           // 将签名加入businessHead中
        $arr['businessHead'] = $head;
        $arr['businessContext'] = $context;

        $json_arr = json_encode($arr, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        // RSA加密   RSA公钥长字符串加密 单次加密最大长度为(key_size/8)-11 1024bit的证书为117bytes, 这里1024bit的用117bytes
        $encrypt = '';
        foreach (str_split($json_arr, 117) as $chunk) {
            openssl_public_encrypt($chunk, $encrypt_data, $public_key);
            $encrypt .= $encrypt_data;
        }
        $encrypts = base64_encode($encrypt);

        $context_array = [
            'context' => $encrypts,
        ];
        $json_context_array = json_encode($context_array);

        $request_url = $pay_config['request_url'];    // 请求地址

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $request_url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_context_array);
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);
        curl_setopt(
            $ch,
            CURLOPT_HTTPHEADER,
            array(
                "Content-Type: application/json; charset=utf-8",
                "Content-Length: " . strlen($json_context_array)
            )
        );
        ob_start();
        curl_exec($ch);
        $resdata = ob_get_contents();
        ob_end_clean();
        $resarray = json_decode($resdata, true);

        if (isset($resarray['success']) && $resarray['success'] == 'true') {

            $context_str = $resarray['context'];
            $decrypt = '';
            $decrypt_decode = base64_decode($context_str);
            foreach (str_split($decrypt_decode, 128) as $chunk) {
                openssl_private_decrypt($chunk, $decrypt_data, $key);
                $decrypt .= $decrypt_data;
            }
            $return_context_array = json_decode($decrypt, true);

            // 成功     
            $verify_param = $return_context_array['businessContext']['lxbOrderNumber'];
            $url = $return_context_array['businessContext']['content'];

            return ['code' => 200, 'msg' => substr($decrypt, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        if (isset($decrypt)) {
            $resdata = $decrypt;
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 北付宝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function beifubaoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        $other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";

        $private_key = openssl_pkey_get_private($key);
        $public_key = openssl_pkey_get_public($other_public_key);

        $head = [
            'charset' => 'utf-8', // 字符集
            'version' => '1.0', // 版本号
            'method' => 'UNIFIED_PAYMENT', // 请求接口名称
            'memberNumber' => $pay_config['merchant_id'], // 会员编号
            'requestTime' => date('Ymdhms'), // 请求时间
            'signType' => 'RSA', // 签名类型
            'sign' => '', // 签名信息
        ];

        $context = [
            'defrayalType' => 'ALI_H5', // 支付方式
            'memberOrderNumber' => $order_id, // 商户请求支付的订单号
            'tradeCheckCycle' => 'T1', // 结算周期 T1,D0 暂时只支持T1
            'orderTime' => date('Ymdhms'), // 订单时间
            'currenciesType' => 'CNY', // 币种
            'tradeAmount' => 100, // 交易金额,以分为单位
            'commodityBody' => '商品信息', // 商品信息
            'commodityDetail' => '商品详情', // 商品详情
            'commodityRemark' => '商品备注', // 商品备注
            'notifyUrl' => $pay_config['notify_url'], // 商户接收北付宝异步通知的地址
            'returnUrl' => $pay_config['return_url'], // 支付完成后跳转
            'terminalIP' => '8.8.8.8', // 付款设备或发起请求的服务的IP地址
            'terminalId' => 'terminalId', // 付款设备的ID编号
            'userId' => 'userId', // 当交易方式为反扫时，必填
            'attach' => $order_id, // 交易备注信息
            'remark' => $order_id, // 商户可自行设置附加信息，订单查询会原值返回
            'lxbOrderNumber' => $order_id, // 商户可自行设置附加信息，订单查询会原值返回
        ];
        ksort($context);

        $json_context = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        openssl_sign($json_context, $sign, $private_key, OPENSSL_ALGO_MD5);    // MD5方式 使用商户私钥进行签名
        $sign = base64_encode($sign);    // 最终的签名
        $head['sign'] = $sign;           // 将签名加入businessHead中
        $arr['businessHead'] = $head;
        $arr['businessContext'] = $context;

        $json_arr = json_encode($arr, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        // RSA加密   RSA公钥长字符串加密 单次加密最大长度为(key_size/8)-11 1024bit的证书为117bytes, 这里1024bit的用117bytes
        $encrypt = '';
        foreach (str_split($json_arr, 117) as $chunk) {
            openssl_public_encrypt($chunk, $encrypt_data, $public_key);
            $encrypt .= $encrypt_data;
        }
        $encrypts = base64_encode($encrypt);

        $context_array = [
            'context' => $encrypts,
        ];
        $json_context_array = json_encode($context_array);

        $request_url = $pay_config['request_url_query'];    // 请求地址

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $request_url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_context_array);
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);
        curl_setopt(
            $ch,
            CURLOPT_HTTPHEADER,
            array(
                "Content-Type: application/json; charset=utf-8",
                "Content-Length: " . strlen($json_context_array)
            )
        );
        ob_start();
        curl_exec($ch);
        $resdata = ob_get_contents();
        ob_end_clean();
        $resarray = json_decode($resdata, true);

        if (isset($resarray['success']) && $resarray['success'] == 'true') {

            $context_str = $resarray['context'];
            $decrypt = '';
            $decrypt_decode = base64_decode($context_str);
            foreach (str_split($decrypt_decode, 128) as $chunk) {
                openssl_private_decrypt($chunk, $decrypt_data, $private_key);
                $decrypt .= $decrypt_data;
            }
            $return_context_array = json_decode($decrypt, true);
            // 成功     
            $verify_param = $return_context_array['businessContext']['lxbOrderNumber'];
            $url = $return_context_array['businessContext']['orderStatus'];
            // 成功                 
            if ($return_context_array['businessContext']['orderStatus'] == 'SUCCESS') {
                return ['code' => 200, 'msg' => substr($decrypt, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        if (isset($decrypt)) {
            $resdata = $decrypt;
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 天道支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function tiandao($parameters = [], $pay_config = [])
    {
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wechat.scan';
                break;
            case 'alipay_h5':
                $type = 'alipay.h5';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['mch_id'] = $pay_config['merchant_id'];                  // 商户号
        $arr['pay_type'] = $type;                                     // 支付宝扫码：html.alipay   微信扫码：html.weixin   支付宝h5：html.alipaywap
        $arr['order_id'] = $parameters['order_id'];                   // 商户订单号
        $arr['order_time'] = time();                                  // 时间戳
        $arr['title'] = $parameters['body'];                    // 商品名称 
        $arr['amount'] = intval(strval($parameters['cash'] * 100));   // 总金额，以分为单位，整数，不允许包含任何字母、符号
        $arr['bank_code'] = 'CMB';                                    // 付款银行代码
        $arr['page_url'] = $parameters['return_url'];                 // 支付完成后前端跳转页面URL，部分支付方式支持
        $arr['notify_url'] = $pay_config['notify_url'];               // 接收平台异步通知的URL，需给绝对路径，255字符内格式,客户支付成功后会发起异步通知
        $arr['request_ip'] = $parameters['ip'];                       // 支付请求发起的IP地址，部分支付需要
        $arr['reserve1'] = date('YmdHis') . rand(100000, 999999);     // 请求响应和notify时均带上此字段原来的值

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $header = array('typ' => 'JWT', 'alg' => 'RS256');
        $segments = array();
        $segments[] = str_replace('=', '', strtr(base64_encode(json_encode($header)), '+/', '-_'));
        $segments[] = str_replace('=', '', strtr(base64_encode(json_encode($arr)), '+/', '-_'));
        $signing_input = implode('.', $segments);
        $signature = '';
        openssl_sign($signing_input, $signature, $key, 'SHA256');

        $segments[] = str_replace('=', '', strtr(base64_encode($signature), '+/', '-_'));
        $param = implode('.', $segments);

        $request_url = $pay_config['request_url'];                 // 请求地址
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['code']) && $resarray['code'] == '0') {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 天道支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function tiandaoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $arr['mch_id'] = $pay_config['merchant_id'];      // 商户号
        $arr['order_id'] = $order_id;                     // 商户订单号

        $header = array('typ' => 'JWT', 'alg' => 'RS256');
        $segments = array();
        $segments[] = str_replace('=', '', strtr(base64_encode(json_encode($header)), '+/', '-_'));
        $segments[] = str_replace('=', '', strtr(base64_encode(json_encode($arr)), '+/', '-_'));
        $signing_input = implode('.', $segments);
        $signature = '';
        openssl_sign($signing_input, $signature, $key, 'SHA256');

        $segments[] = str_replace('=', '', strtr(base64_encode($signature), '+/', '-_'));
        $param = implode('.', $segments);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址

        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 8) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
         * trade_state	
         * 0—待支付, 
         * 7—支付失败(其他原因，如银行返回失败)，
         * 8-支付成功
         */
    }

    /**
     * 看富支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function kehupay($parameters = [], $pay_config = [])
    {

        /*
          默认微信：wx
          支付宝:ali
          云闪付:union
          聚合支付宝：w_ali
          聚合微信：w_wx
          QQ钱包：qq
          JD钱包：jd
         */
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wx';
                $mode = 'H5';
                break;
            case 'wechat_scan_code':
                $type = 'wx';
                $mode = 'SCAN';
                break;
            case 'alipay_h5':
                $type = 'ali';
                $mode = 'H5';
                break;
            case 'alipay_scan_code':
                $type = 'ali';
                $mode = 'SCAN';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['txnAmt'] = intval(strval($parameters['cash'] * 100));    // 交易金额为分
        $arr['payChannel'] = $pay_config['merchant_id'];               // 交易渠道号
        $arr['accessKey'] = $pay_config['app_id'];                     // 交易秘钥
        $arr['osType'] = 'AND';                                        // 系统类型 IOS 或者 AND
        $arr['orderNo'] = $parameters['order_id'];                     // 订单号，用户自己生成，注意：返回的订单号被加上了渠道号***/
        $arr['orderDesc'] = $parameters['body'];                 // 商品描述
        $arr['orderInfo'] = $parameters['body'];                 // 订单信息
        $arr['returnUrl'] = $parameters['return_url'];                 // 支付成功后跳转地址
        $arr['notifyUrl'] = $pay_config['notify_url'];                 // 支付异步回调地址
        $arr['time'] = date('YmdHis') . '000';                         // 必填，时间戳，24小时制，使用yyyyMMddHHmmssSSS 
        $arr['ext'] = date('YmdHis');                                  // 扩展参数
        $arr['payType'] = $type;                                       // 支付方式
        $arr['operationType'] = $mode;                                 // 默认为H5，扫码：SCAN 
        $sign = md5($arr['txnAmt'] . $arr['payChannel'] . $arr['accessKey'] . $arr['osType'] . $arr['ext'] . $arr['orderNo'] . $arr['time']);

        $arr['sign'] = md5($sign . $pay_config['key']);
        $request_url = $pay_config['request_url'];                     // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payUrl']) && strlen($resarray['data']['payUrl']) >= 10) {
            // 成功     
            $verify_param = $resarray['data']['orderId'];
            $url = $resarray['data']['payUrl'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 看富支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function kehupayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['payChannel'] = $pay_config['merchant_id'];     // 交易渠道号
        $arr['accessKey'] = $pay_config['app_id'];           // 交易秘钥
        $arr['orderNo'] = $order_id;                         // 客户订单号
        $arr['orderId'] = $order_id;                         // 平台订单号
        $arr['time'] = date('YmdHis') . '000';               // 必填，时间戳，24小时制，使用yyyyMMddHHmmssSSS 

        $request_url = $pay_config['request_url_query'];     // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payStatus']) && $resarray['data']['payStatus'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        // payStatus 0:创建，1：支付成功，2：支付失败
    }

    /**
     * 荔滔博支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function litaobo($parameters = [], $pay_config = [])
    {
        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '2002';
                break;
            case 'kuaijie':
                $type = '3002';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = 'V1.0';                                                   // 接口版本号，默认V1.0
        $arr['merNo'] = $pay_config['merchant_id'];                                 // 商户号，平台提供给商户的唯一标识
        $arr['transTime'] = date('YmdHis');                                         // 交易提交的时间      
        $arr['orderNo'] = $parameters['order_id'];                                  // 商户自定义单号，唯一标识一笔交易
        $arr['amount'] = sprintf("%.2f", $parameters['cash']);                      // 单位：元，保留两位小数      
        $arr['memberIp'] = $parameters['ip'];                                       // 客户端发起IP地址                                          
        $arr['tradeType'] = $type;                                                  // 业务类型，详见 业务类型码
        $arr['returnUrl'] = $parameters['return_url'];                              // 页面地址。扫码选填，WAP必填
        $arr['notifyUrl'] = $pay_config['notify_url'];                              // 服务器异步通知
        $arr['goodsId'] = $parameters['body'];                                // 购买的商品名称
        $arr['cardNo'] = '6217002870051515849';                                     // 银行卡号
        //$arr['authCode'] = '';                                                    // 当tradeType为1012时该字段必填；填写规则：卡号,密码,金额通过加密秘钥进行加密
        //$arr['goodsInfo'] = '商品描述';                                           // 商品描述
        //$arr['subMerNo'] = '';                                                    // 子商户号
        //$arr['subMerName'] = '';                                                  // 子商户名称
        $arr['fileId1'] = $parameters['order_id'];                                  // 备用字段1，原值返回
        //$arr['fileId2'] = $parameters['order_id'];                                // 备用字段2，原值返回
        //$arr['fileId3'] = $parameters['order_id'];                                // 备用字段3，原值返回

        ksort($arr);
        $temp = '';
        foreach ($arr as $k => $v) {
            $temp .= $k . '=' . $v . '&';
        }
        $sign = $temp . 'key=' . $pay_config['key'];
        $arr['sign'] = strtoupper(md5($sign));

        $request_url = $pay_config['request_url'];                                  // 请求地址
        if ($parameters['type'] == 'kuaijie') {
            $request_url = $pay_config['request_url_kuaijie'];
        }
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['qrcode']) && strlen($resarray['qrcode']) > 10) {

            // 成功     
            $verify_param = $resarray['orderNo'];
            $url = urldecode($resarray['qrcode']);
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 荔滔博支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function litaoboVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['version'] = 'V1.0';                           // 接口版本号，默认V1.0
        $arr['merNo'] = $pay_config['merchant_id'];         // 商户号，平台提供给商户的唯一标识
        $arr['orderNo'] = $order_id;                        // 商户自定义单号，唯一标识一笔交易                                  
        $arr['tradeType'] = '1';                            // 查询请求类型1：交易订单2：代付订单

        ksort($arr);
        $temp = '';
        foreach ($arr as $k => $v) {
            $temp .= $k . '=' . $v . '&';
        }
        $sign = $temp . 'key=' . $pay_config['key'];
        $arr['sign'] = strtoupper(md5($sign));
        $request_url = $pay_config['request_url_query'];    // 请求查询地址

        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 100) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          订单实际状态；
         * 100-交易成功，
         * 101-等待支付，
         * 102-交易失败，
         * 103-订单已取消，
         * 104-处理中
         */
    }

    /**
     * 大自在支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function dazizai($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ALIH5';
                break;
            case 'qq_h5':
                $type = 'QQSCAN';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['partner_id'] = $pay_config['merchant_id'];                        // 商户编号为 17 位数字
        $arr['no_order'] = $parameters['order_id'];                             // 商户系统唯一订单号
        $arr['name_goods'] = $parameters['body'];                         // 商品名称
        $arr['money_order'] = sprintf("%.2f", $parameters['cash']);             // 单位为RMB-元 精确到小数点后两位
        $arr['dt_order'] = date('YmdHi');                                       // 商户订单时间 定(12)位数字
        /*
            WXH5 微信支付H5
            QQH5 QQ钱包H5
            JDH5 京东支付H5
            ALIH5 支付宝H5
            GATEWAY 网关快捷支付
            WXSCAN 微信支付扫码
            QQSCAN QQ钱包扫码
            JDSCAN 京东支付扫码
            ALISCAN 支付宝扫码
         */
        $arr['pay_type'] = $type;                                               // 支付产品编号 
        $arr['notify_url'] = $pay_config['notify_url'];                         // 异步通知地址
        $arr['return_url'] = $parameters['return_url'];                         // 同步通知地址
        $arr['encrypt'] = $pay_config['key'];
        ksort($arr);
        $temp = '';
        foreach ($arr as $key => $value) {
            $temp .= $key . '=' . $value . '&';
        }
        $tj = rtrim($temp, "&");
        $arr['sign'] = md5($tj);                                                // 签名

        $request_url = $pay_config['request_url'];                              // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_url']) && strlen($resarray['pay_url']) > 10) {

            // 成功     
            $verify_param = $resarray['no_order'];
            $url = $resarray['pay_url'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 大自在支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function dazizaiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['partner_id'] = $pay_config['merchant_id'];          // 商户编号为 17 位数字
        $arr['no_order'] = $order_id;                             // 商户系统唯一订单号
        $arr['encrypt'] = $pay_config['key'];
        ksort($arr);
        $temp = '';
        foreach ($arr as $key => $value) {
            $temp .= $key . '=' . $value . '&';
        }
        $tj = rtrim($temp, "&");
        $arr['sign'] = md5($tj);                                  // 签名

        $request_url = $pay_config['request_url_query'];          // 请求查询地址

        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['ret_code']) && $resarray['ret_code'] == 9999) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          订单实际状态；
          9991 等待交易
          9992 交易处理中
          9999 交易成功
         */
    }

    /**
     * 合利宝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function helipay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wangyin':
                $type = 'OnlinePay';                                // 接口类型：网银支付
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['P1_bizType'] = $type;                                 // 接口类型：网银支付
        $arr['P2_orderId'] = $parameters['order_id'];               // 商户订单号
        $arr['P3_customerNumber'] = $pay_config['merchant_id'];     // 商户号
        $arr['P4_orderAmount'] = $parameters['cash'];               // 订单金额(单位:元)
        $arr['P5_bankId'] = $parameters['bank_code'];               // 银行编码
        $arr['P6_business'] = $parameters['business_type'];         // 业务类型 B2C:个人支付，B2B:企业支付
        $arr['P7_timestamp'] = date('ymdhis');                      // 时间戳 格式：yyyyMMddHHmmss 14位数字，精确到秒
        $arr['P8_goodsName'] = $parameters['body'];           // 商品名称：URLEncoder.encode(“商品名称”, “utf-8”)
        $arr['P9_period'] = '3';                                    // 有效期：过了订单有效时间的订单会被设置为取消状态不能再重新进行支付。
        $arr['P10_periodUnit'] = 'Hour';                            // 有效期单位：Day：天  Hour：时  Minute：分
        $arr['P11_callbackUrl'] = $parameters['return_url'];        // 商户号跳转地址
        $arr['P12_serverCallbackUrl'] = $pay_config['notify_url'];  // 商户号通知地址
        $arr['P13_orderIp'] = $parameters['ip'];                    // 客户端ip
        $arr['P14_onlineCardType'] = '';                            // 借贷类型：DEBIT:借记     CREDIT：贷记该参数可为空，参数为空时默认借贷混合
        $arr['P15_desc'] = date('YmdHis') . rand(600000, 999999);   // 备注： URLEncoder.encode(“备注”, “utf-8”) 
        $key = $pay_config['key'];                                  // 密钥

        $source = '&' . implode('&', $arr) . '&' . $key;
        $arr['sign'] = md5($source);                                // MD5签名
        $request_url = $pay_config['request_url'];                  // 请求的页面地址  
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 合利宝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function helipayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['P1_bizType'] = 'OnlineQuery';                                                    // 接口类型：网银支付
        $arr['P2_orderId'] = $order_id;                                                // 商户号订单号
        $arr['P3_customerNumber'] = $pay_config['merchant_id'];                        // 商户号
        $key = $pay_config['key'];                                                     // 密钥
        $arr['sign'] = md5('&' . implode('&', $arr) . '&' . $key);                     // 签名,urldecode解码已编码的 URL 字符串(原始值)
        $request_url = $pay_config['request_url_query'];                               // 请求的页面地址  
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['rt2_retCode']) && $resarray['rt2_retCode'] == '0000') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /**
          0000	成功
          8001	订单号不唯一
          8101	订单金额不正确
          8102	订单不存在
          8103	订单状态异常
          8104	订单对应的渠道未在系统中配置
          8105	退款金额超过了订单实付金额
          8106	渠道请求交互验签错误
          8107	订单已过期
          8108	订单已存在,请更换订单号重新下单
          8109	商户未开通此银行
         */
    }

    /**
     * 汇游通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function huupay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wxwap';
                break;
            case 'alipay_h5':
                $type = 'alipaywap';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['p0_Cmd'] = 'Buy';                                           // 业务类型,固定值“Buy”
        $arr['p1_MerId'] = $pay_config['merchant_id'];                    // 商户编号
        $arr['p2_Order'] = $parameters['order_id'];                       // 商户订单号
        $arr['p3_Amt'] = $parameters['cash'];                             // 支付金额
        $arr['p4_Cur'] = 'CNY';                                           // 交易币种
        $arr['p5_Pid'] = urlencode($parameters['cash']);                  // 商品名称
        $arr['p6_Pcat'] = $arr['p5_Pid'];                                 // 商品种类
        $arr['p7_Pdesc'] = $arr['p5_Pid'];                                // 商品描述
        $arr['p8_Url'] = $pay_config['notify_url'];                       // 商户接收支付成功数据的地址，异步通知地址
        $arr['pa_MP'] = date('ymdHis') . random(6);                       // 商户扩展信息
        $arr['pd_FrpId'] = $type;                                         // 支付通道编码:qqwap,alipaywap,wxwap
        $arr['pr_NeedResponse'] = '1';                                    // 应答机制
        $key = $pay_config['key'];                                        // 密钥
        $array_values = array_values($arr);
        $v = implode('', $array_values);
        $arr['hmac'] = hash_hmac('md5', $v, $key);                        // 签名数据
        $arr['getJson'] = 0;                                              // json格式
        $request_url = $pay_config['request_url'];                        // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '0') {
            // 成功     
            $results = $resarray['result'];
            $verify_param = $results['terraceOrder'];
            $url = $results['payUrl'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 汇游通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huupayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['orderNum'] = $order_id;                                 // 商户订单
        $arr['userId'] = $pay_config['merchant_id'];                  // 商户ID
        $arr['key'] = $pay_config['key'];                             // 商户秘钥
        $request_url = $pay_config['request_url_query'];              // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '0') {
            if (isset($resarray['result']['code']) && $resarray['result']['code'] == '0') {
                // 支付成功
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /**
         * 成功     status = 0;
         * code：
          4：处理成功，但是回调失败
          2：正在处理
          1：订单错误
          0：支付成功
         */
    }

    /**
     * 来店付支付
     * @access public
     * @param  array  $parameters  创建订单参数
     * @param  array  $pay_config  支付配置
     * @return boolean
     */
    public function laidianfu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = 'wxh5';
                break;
            case 'alipay_h5':
                $paytype = 'alipaywap';
                break;
            case 'kuaijie':
                $paytype = 'kuaijie';
                break;
            case 'alipay_scan_code':
                $paytype = 'alipay';
                break;
            case 'wechat_scan_code':
                $paytype = 'weixin';
                break;
            case 'wangyin':
                $paytype = 'bank';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                      // 版本号
        $arr['customerid'] = $pay_config['merchant_id'];              // 商户号
        $arr['sdorderno'] = $parameters['order_id'];                  // 商户订单号不超过30
        $arr['total_fee'] = sprintf("%.2f", $parameters['cash']);     // 付款金额（小数点两位）
        /*
          支付宝扫码	alipay
          微信扫码	weixin
          支付宝wap	alipaywap
          微信wap	wxh5
          在线网银	bank
          快捷支付	kuaijie
         */
        $arr['paytype'] = $paytype;                                   // 支付类型
        $arr['notifyurl'] = $pay_config['notify_url'];                // 异步通知
        $arr['returnurl'] = $parameters['return_url'];                // 同步
        $arr['remark'] = $parameters['order_id'];                     // 附加参数
        $arr['bankcode'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';    // 银行编号
        $key = $pay_config['key'];
        $arr['sign'] = md5('version=' . $arr['version'] . '&customerid=' . $arr['customerid'] . '&total_fee=' . $arr['total_fee'] . '&sdorderno=' . $arr['sdorderno'] . '&notifyurl=' . $arr['notifyurl'] . '&returnurl=' . $arr['returnurl'] . '&' . $key);
        $arr['get_code'] = '1';

        $request_url = $pay_config['request_url'];                    // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        if (strlen($resdata) > 1000) {
            // 成功(认为是网页)
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        } else {
            return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
    }

    /**
     * 来店付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function laidianfuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'customerid' => $pay_config['merchant_id'],
            'sdorderno' => $order_id,
            'reqtime' => date('YmdHis'),
        ];
        $arr['sign'] = md5('customerid=' . $arr['customerid'] . '&sdorderno=' . $arr['sdorderno'] . '&reqtime=' . $arr['reqtime'] . '&' . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status=1    —支付成功
         */
    }

    /**
     * 优支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function youzhifu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = 'wxh5';
                break;
            case 'alipay_h5':
                $paytype = 'alipay';
                break;
            case 'kuaijie':
                $paytype = 'quickpay';
                break;
            case 'alipay_scan_code':
                $paytype = 'alism';
                break;
            case 'wechat_scan_code':
                $paytype = 'wxsm';
                break;
            case 'wangyin':
                $paytype = 'bank';
                break;
            case 'unionpay_scan_code':
                $paytype = 'ylsm';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                         // 版本号
        $arr['customerid'] = $pay_config['merchant_id'];                 // 商户号
        $arr['sdorderno'] = $parameters['order_id'];                     // 商户号订单号不超过30
        $arr['total_fee'] = sprintf("%.2f", $parameters['cash']);        // 付款金额（小数点两位）
        $arr['paytype'] = $paytype;                                      // 支付类型
        $arr['notifyurl'] = $pay_config['notify_url'];                   // 异步通知
        $arr['returnurl'] = $parameters['tj_return_url'];                // 同步
        $arr['remark'] = date('YmdHis') . rand(10000000, 99999999);      // 附加参数
        $arr['bankcode'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';    // 银行编号
        $key = $pay_config['key'];
        $arr['sign'] = md5('version=' . $arr['version'] . '&customerid=' . $arr['customerid'] . '&total_fee=' . $arr['total_fee'] . '&sdorderno=' . $arr['sdorderno'] . '&notifyurl=' . $arr['notifyurl'] . '&returnurl=' . $arr['returnurl'] . '&' . $key);
        $arr['json'] = '1';

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['next_url']) && strlen($resarray['next_url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 优支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function youzhifuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'customerid' => $pay_config['merchant_id'],
            'sdorderno' => $order_id,
            'reqtime' => date('YmdHis'),
        ];
        $arr['sign'] = md5('customerid=' . $arr['customerid'] . '&sdorderno=' . $arr['sdorderno'] . '&reqtime=' . $arr['reqtime'] . '&' . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status=1    —支付成功
         */
    }

    /**
     * goifox支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function goifox($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = 'wxh5';
                break;
            case 'alipay_h5':
                $paytype = 'alipaywap';
                break;
            case 'kuaijie':
                $paytype = 'kuaijie';
                break;
            case 'alipay_scan_code':
                $paytype = 'alipay';
                break;
            case 'wechat_scan_code':
                $paytype = 'weixin';
                break;
            case 'wangyin':
                $paytype = 'bank';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                         // 版本号
        $arr['customerid'] = $pay_config['merchant_id'];                 // 商户号
        $arr['sdorderno'] = $parameters['order_id'];                     // 商户号订单号不超过30
        $arr['total_fee'] = sprintf("%.2f", $parameters['cash']);        // 付款金额（小数点两位）
        /*
          支付宝扫码	alipay
          微信扫码	weixin
          支付宝wap	alipaywap
          微信wap	wxh5
          在线网银	bank
          快捷支付	kuaijie
         */
        $arr['paytype'] = $paytype;                                      // 支付类型
        $arr['notifyurl'] = $pay_config['notify_url'];                   // 异步通知
        $arr['returnurl'] = $pay_config['notify_url'];                   // 同步
        $arr['remark'] = $parameters['order_id'];                        // 附加参数
        $arr['bankcode'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';    // 银行编号
        $arr['get_code'] = '1';

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        $other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";

        $private_key = openssl_pkey_get_private($key);
        $public_key = openssl_pkey_get_public($other_public_key);

        $contents = json_encode($arr);

        $crypto = '';
        foreach (str_split($contents, 117) as $chunk) {
            openssl_public_encrypt($chunk, $encryptData, $public_key);
            $crypto .= $encryptData;
        }
        $data = base64_encode($crypto);
        $post_data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);

        $signstr = md5($post_data . $pay_config['app_id']);

        $ret = false;
        if (openssl_sign($signstr, $ret, $private_key, OPENSSL_ALGO_SHA1)) {
            $sign = base64_encode('' . $ret);
        }

        $post = [
            'sign' => $sign,
            'data' => $post_data,
            'id' => $pay_config['merchant_id']
        ];

        $request_url = $pay_config['request_url'];                       // 请求地址
        $resdata = go_curl($request_url, $post, 'post', $pay_config['wait_second']);
        if (strlen($resdata) > 1000) {
            // 成功(认为是网页)
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        } else {
            return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
    }

    /**
     * goifox支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function goifoxVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['app_id'];
        $arr = [
            'customerid' => $pay_config['merchant_id'],
            'sdorderno' => $order_id,
            'reqtime' => date('YmdHis'),
        ];
        $arr['sign'] = md5('customerid=' . $arr['customerid'] . '&sdorderno=' . $arr['sdorderno'] . '&reqtime=' . $arr['reqtime'] . '&' . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status=1    —支付成功
         */
    }

    /**
     * 汇腾支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function huiteng($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = 'wxh5';
                break;
            case 'alipay_h5':
                $paytype = 'alipaywap';
                break;
            case 'kuaijie':
                $paytype = 'kuaijie';
                break;
            case 'alipay_scan_code':
                $paytype = 'alipay';
                break;
            case 'wechat_scan_code':
                $paytype = 'weixin';
                break;
            case 'wangyin':
                $paytype = 'bank';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                         // 版本号
        $arr['customerid'] = $pay_config['merchant_id'];                 // 商户号
        $arr['sdorderno'] = $parameters['order_id'];                     // 商户号订单号不超过30
        $arr['total_fee'] = sprintf("%.2f", $parameters['cash']);        // 付款金额（小数点两位）
        /*
          支付宝扫码	alipay
          微信扫码	weixin
          支付宝wap	alipaywap
          微信wap	wxh5
          在线网银	bank
          快捷支付	kuaijie
         */
        $arr['paytype'] = $paytype;                                      // 支付类型
        $arr['notifyurl'] = $pay_config['notify_url'];                   // 异步通知
        $arr['returnurl'] = $pay_config['notify_url'];                   // 同步
        $arr['remark'] = date('YmdHis') . rand(100000, 999999);          // 附加参数
        $arr['bankcode'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';    // 银行编号
        $key = $pay_config['key'];
        $arr['sign'] = md5('version=' . $arr['version'] . '&customerid=' . $arr['customerid'] . '&total_fee=' . $arr['total_fee'] . '&sdorderno=' . $arr['sdorderno'] . '&notifyurl=' . $arr['notifyurl'] . '&returnurl=' . $arr['returnurl'] . '&' . $key);
        $arr['get_code'] = '1';

        $request_url = $pay_config['request_url'];                       // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        if (strlen($resdata) > 100) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 汇腾支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huitengVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'customerid' => $pay_config['merchant_id'],
            'sdorderno' => $order_id,
            'reqtime' => date('YmdHis'),
        ];
        $arr['sign'] = md5('customerid=' . $arr['customerid'] . '&sdorderno=' . $arr['sdorderno'] . '&reqtime=' . $arr['reqtime'] . '&' . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 1) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status=1    —支付成功
         */
    }

    /**
     * 卡秀支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function kaxiupay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = '1005';
                break;
            case 'alipay_h5':
                $paytype = '1006';
                break;
            case 'kuaijie':
                $paytype = '2088';
                break;
            case 'alipay_scan_code':
                $paytype = '992';
                break;
            case 'wechat_scan_code':
                $paytype = '1004';
                break;
            case 'wangyin':
                $paytype = '2087';
                break;
            case 'qq_h5':
                $paytype = '1594';
                break;
            case 'jd_h5':
                $paytype = '1009';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['parter'] = $pay_config['merchant_id'];                        // 商户ID
        $arr['type'] = $paytype;                                            // 支付类型
        $arr['value'] = sprintf("%.2f", $parameters['cash']);               // 单位元（人民币），2位小数
        $arr['orderid'] = $parameters['order_id'];                          // 商户系统订单号
        $arr['callbackurl'] = $pay_config['notify_url'];                    // 下行异步通知地址
        $arr['hrefbackurl'] = $parameters['return_url'];                    // 同步跳转地址
        $arr['payerIp'] = $parameters['ip'];                                // 支付用户IP
        $arr['attach'] = $parameters['order_id'];                           // 备注消息
        $key = $pay_config['key'];
        $arr['sign'] = md5('parter=' . $arr['parter'] . '&type=' . $arr['type'] . '&value=' . $arr['value'] . '&orderid=' . $arr['orderid'] . '&callbackurl=' . $arr['callbackurl'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];                          // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 卡秀支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function kaxiupayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'parter' => $pay_config['merchant_id'],
            'orderid' => $order_id,
        ];
        $arr['sign'] = md5('orderid=' . $arr['orderid'] . '&parter=' . $arr['parter'] . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $pos = strpos($resdata, 'opstate=0');
        if ($pos !== false) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        // orderid=180810145225172018141680&opstate=0&ovalue=1.00&sign=2bc806f93f7483780790d1c35b42b705&msg=查询成功
        /*
          opstate=0    —支付成功
         */
    }

    /**
     * 惠清云支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function huiqingpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = '1005';
                break;
            case 'alipay_h5':
                $paytype = '1006';
                break;
            case 'kuaijie':
                $paytype = '2088';
                break;
            case 'alipay_scan_code':
                $paytype = '992';
                break;
            case 'wechat_scan_code':
                $paytype = '1004';
                break;
            case 'wangyin':
                $paytype = '2087';
                break;
            case 'qq_h5':
                $paytype = '1594';
                break;
            case 'jd_h5':
                $paytype = '1009';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['parter'] = $pay_config['merchant_id'];                        // 商户ID
        $arr['type'] = $paytype;                                            // 支付类型
        $arr['value'] = sprintf("%.2f", $parameters['cash']);               // 单位元（人民币），2位小数
        $arr['orderid'] = $parameters['order_id'];                          // 商户系统订单号
        $arr['callbackurl'] = $pay_config['notify_url'];                    // 下行异步通知地址
        $arr['hrefbackurl'] = $parameters['return_url'];                    // 同步跳转地址
        $arr['payerIp'] = $parameters['ip'];                                // 支付用户IP
        $arr['attach'] = $parameters['order_id'];                           // 备注消息
        $key = $pay_config['key'];
        $arr['sign'] = md5('parter=' . $arr['parter'] . '&type=' . $arr['type'] . '&value=' . $arr['value'] . '&orderid=' . $arr['orderid'] . '&callbackurl=' . $arr['callbackurl'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];                          // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 惠清云支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huiqingpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr = [
            'parter' => $pay_config['merchant_id'],
            'orderid' => $order_id,
        ];
        $arr['sign'] = md5('orderid=' . $arr['orderid'] . '&parter=' . $arr['parter'] . $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $pos = strpos($resdata, 'opstate=0');
        if ($pos !== false) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        // orderid=180810145225172018141680&opstate=0&ovalue=1.00&sign=2bc806f93f7483780790d1c35b42b705&msg=查询成功
        /*
          opstate=0    —支付成功
         */
    }

    /**
     * 智付支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function zhifu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_scan_code':
                $type = '0502';
                break;
            case 'alipay_h5':
                $type = '0506';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '2.1';                                 // 固定值:2.1 
        $arr['orgNo'] = $pay_config['app_id'];                   // 平台下发的机构编号
        $arr['custId'] = $pay_config['merchant_id'];             // 平台提供的商户编号
        $arr['custOrderNo'] = $parameters['order_id'];           // 订单号
        /*
          交易类型:
          0402:微信扫码
          0406:微信H5
          0701:QQ钱包（H5）
          0702:QQ钱包扫码（直连）
          0502:支付宝扫码
          0503:支付宝App扫码
          0506:支付宝H5（直连）【返回连接】
          0507:支付宝AppH5
          0902:京东扫码
          0901:京东H5
          0302: 快捷（直连）
          0601:网关支付(直连银行)
          0802:银联扫码(收银行)
         */
        $arr['tranType'] = $type;                                // 交易类型 
        $arr['payAmt'] = intval(strval($parameters['cash'] * 100));  // 支付金额,单位:分 
        $arr['backUrl'] = $pay_config['notify_url'];             // 支付完成时回调客户方结果接收地址 
        $arr['frontUrl'] = $pay_config['return_url'];            // 可提供前台通知地址
        $arr['bankCode'] = '';                                   // 网关支付必传银行编码
        $arr['goodsName'] = $parameters['body'];           // 交易商品名称 
        $arr['orderDesc'] = $parameters['body'];           // 交易订单描述 
        $arr['qxsbId'] = '';                                     // 客户的个人唯一标识 
        $arr['cardNo'] = '';                                     // 快捷通道为必填字段，请输入付款人的银行卡号 
        $arr['idcard'] = '';                                     // 快捷通道为必填字段，请输入付款人的身份证号 
        $arr['accountName'] = '';                                // 快捷通道为必填字段，请输入付款人的姓名 
        $arr['telphone'] = '';                                   // 快捷通道为必填字段，请输入付款人的手机号 
        $arr['buyIp'] = $parameters['ip'];                       // 购买者Ip 

        $key = $pay_config['key'];
        $arr = array_filter($arr);
        ksort($arr);

        $string = "";
        $string = http_build_query($arr);
        $string = $string . '&key=' . $key;
        $string = strtoupper(md5(urldecode($string)));
        $arr['sign'] = $string;

        $request_url = $pay_config['request_url'];               // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['busContent']) && strlen($resarray['busContent']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 智付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zhifuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['version'] = '2.1';                                 // 固定值:2.1 
        $arr['orgNo'] = $pay_config['app_id'];                   // 平台下发的机构编号
        $arr['custId'] = $pay_config['merchant_id'];             // 平台提供的商户编号
        $arr['custOrderNo'] = $order_id;                         // 订单号

        $key = $pay_config['key'];
        $arr = array_filter($arr);
        ksort($arr);

        $string = "";
        $string = http_build_query($arr);
        $string = $string . '&key=' . $key;
        $string = strtoupper(md5(urldecode($string)));
        $arr['sign'] = $string;

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['ordStatus']) && $resarray['ordStatus'] == '01') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 轻铜支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function qtong($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay';
                $mode = 'wap';
                break;
            case 'wechat_h5':
                $type = 'wechat';
                $mode = 'wap';
                break;
            case 'kuaijie':
                $type = 'unionpay';
                $mode = 'cashcard';
                break;
            case 'alipay_scan_code':
                $type = 'alipay';
                $mode = 'qrcode';
                break;
            case 'wechat_scan_code':
                $type = 'wechat';
                $mode = 'hub';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['appId'] = $pay_config['merchant_id'];        // 账号 
        $arr['reqStreamId'] = $parameters['order_id'];     // 商户请求流水号 
        $arr['payType'] = $type;                           // 微信支付 wechat 支付宝 alipay
        $arr['mode'] = $mode;                              // H5网页支付: wap 二维码支付：qrcode
        $arr['clientIp'] = $parameters['ip'];              // 客户端IP
        $arr['face'] = intval($parameters['cash']);        // 单位：元
        $arr['timeStamp'] = date('YmdHis');                // 时间戳 
        $arr['sign'] = md5($arr['appId'] . $arr['reqStreamId'] . $arr['payType'] . $arr['mode'] . $arr['clientIp'] . $arr['face'] . $arr['timeStamp'] . $pay_config['key']);

        $request_url = $pay_config['request_url'];         // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payUrl']) && strlen($resarray['data']['payUrl']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 智付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function qtongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appId'] = $pay_config['merchant_id'];
        $arr['orderNo'] = $order_id;
        $arr['timeStamp'] = date('YmdHis');
        $arr['sign'] = md5($arr['appId'] . $arr['orderNo'] . $arr['timeStamp'] . $pay_config['key']);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', 10);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '0') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          0支付成功
          1支付失败
          2 待支付
          3 支付状态未知
          4 查询请求失败
         */
    }

    /**
     * 收米支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function shoumi($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '2001';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['appId'] = $pay_config['merchant_id'];                // 商户标识
        $arr['payMethod'] = $type;                                 // 支付方式 2001：支付宝1001:微信
        $arr['notifyUrl'] = $pay_config['notify_url'];             // 支付成功回调地址
        $arr['returnUrl'] = $parameters['return_url'];             // 支付成功跳转地址
        $arr['outTradeNo'] = $parameters['order_id'];              // 商户支付单标识
        $arr['signType'] = 'MD5';                                  // 签名方式 
        $arr['amount'] = $parameters['cash'];                      // 订单金额
        $arr['buyerId'] = rand(100000, 999999);                    // 商户客户的 id
        $arr['subject'] = $parameters['body'];               // 商品名称
        $arr['body'] = $parameters['body'];                  // 交易商品的描述
        $arr['extendParams'] = date('YmdHis') . rand(100000, 999999); // 扩展参数
        $arr['nonceStr'] = date('YmdHis') . rand(100000, 999999);  // 随机字符串
        $arr['timestamp'] = time();                                // 时间戳

        $key = $pay_config['key'];

        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));
        $header = array(
            "Content-type: application/json;charset='utf-8'",
            "Accept: application/json",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
        );
        $request_url = $pay_config['request_url'];         // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['result']) && strlen($resarray['result']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 收米支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function shoumiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appId'] = $pay_config['merchant_id'];               // 商户标识
        $arr['tradeNo'] = $order_id;                              // 支付方式 2001：支付宝1001:微信
        $arr['nonceStr'] = date('YmdHis') . rand(100000, 999999); // 随机字符串
        $arr['timestamp'] = time();                               // 时间戳
        $arr['signType'] = 'MD5';                                 // 签名方式 
        $key = $pay_config['key'];

        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));
        $header = array(
            "Content-type: application/json;charset='utf-8'",
            "Accept: application/json",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
        );
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['tradeStatus']) && $resarray['tradeStatus'] >= 3000) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          tradeStatus
          2000:支付中
          3000:匹配成功
          3010:回调商户地址
          3020:重试回调商户地址
          3050:回调商户地址失败
          4000:回调成功
          5000:超时关闭
         */
    }

    /**
     * 98支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function sprflat($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ali.wappay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        /*
          微信WAP:weixin.wappay
          支付宝WAP:ali.wappay
          微信扫码:.weixin.native
          微信公众号:.weixin.mppay
          支付宝扫码:ali.native
          银联支付:union.pay
         */
        $arr['service'] = $type;                         // 接口类型
        $arr['version'] = '3.0';                         // 版本号
        $arr['charset'] = 'UTF-8';                       // 字符集
        $arr['sign_type'] = 'MD5';                       // 应用id
        $arr['mch_id'] = $pay_config['merchant_id'];     // 分配给用户的商户号
        $arr['out_trade_no'] = $parameters['order_id'];  // 商户生成的订单号，不可重复
        $arr['body'] = $parameters['order_id'];          // 商品描述
        $arr['attach'] = date('YmdHis') . rand(100000, 999999);         // 附加信息(如果空值就不用参与加密)
        $arr['total_fee'] = intval(strval($parameters['cash'] * 100));  // 金额，单位为分
        $arr['notify_url'] = $pay_config['notify_url'];                 // 接收通知地址URL，确保能通过外网连接
        $arr['callback_url'] = $pay_config['notify_url'];               // 交易完成后的跳转地址
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);      // 随机字符串
        $key = $pay_config['key'];

        ksort($arr);
        $urlval = urldecode(http_build_query($arr));
        $sign = $urlval . '&' . $key;

        $arr['sign'] = md5($sign);
        $header = array('Content-Type: application/json');
        $request_url = $pay_config['request_url'];       // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_info']) && strlen($resarray['pay_info']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 98支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function sprflatVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        switch ($recharge['type']) {
            case 'alipay_h5':
                $type = 'ali.wappay';
                break;
            default:
                return ['code' => 300];
        }
        $arr['service'] = $type;                         // 接口类型
        $arr['version'] = '3.0';                         // 版本号
        $arr['charset'] = 'UTF-8';                       // 字符集
        $arr['sign_type'] = 'MD5';                       // 应用id
        $arr['mch_id'] = $pay_config['merchant_id'];     // 分配给用户的商户号
        $arr['out_trade_no'] = $order_id;                // 商户生成的订单号，不可重复
        $arr['nonce_str'] = date('YmdHis');              // 随机字符串
        $key = $pay_config['key'];

        ksort($arr);
        $urlval = urldecode(http_build_query($arr));
        $sign = $urlval . '&' . $key;

        $arr['sign'] = md5($sign);
        $header = array('Content-Type: application/json');

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '0') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          0表示成功 非0表示失败
         */
    }

    /**
     * 禾管家支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function hgjpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay';
                break;
            case 'wechat_scan_code':
                $type = 'wechat';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['appid'] = $pay_config['merchant_id'];       // 商户appid
        $arr['price'] = $parameters['cash'];              // 订单金额，元
        $arr['payment'] = $type;                          // 支付方式
        $arr['out_order_id'] = $parameters['order_id'];   // 商户订单号
        $arr['out_order_uid'] = rand(100000, 999999);     // 商户客户id 
        $arr['format'] = 'json';                          // 接口业务类型html、json、app
        $arr['notify_url'] = $pay_config['notify_url'];   // 商户后台回调地址 
        $arr['return_url'] = $parameters['return_url'];   // 商户前台回调地址
        $arr['nonce_str'] = rand(100000, 999999);         // 随机字符串 

        $key = $pay_config['key'];                        // 密钥
        $arr = array_filter($arr);

        ksort($arr);
        $string = '';
        $string = http_build_query($arr) . $key;
        $sign = md5(urldecode($string));
        $arr['sign'] = $sign;
        $header = array(
            "Content-Type: application/x-www-form-urlencoded"
        );

        $request_url = $pay_config['request_url'];        // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['url']) && strlen($resarray['data']['url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 禾管家支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function hgjpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['appid'] = $pay_config['merchant_id'];       // 商户appid
        $arr['order_id'] = $order_id;                     // 禾管家支付系统唯一订单号
        $arr['nonce_str'] = rand(100000, 999999);         // 随机字符串 

        $key = $pay_config['key'];     // 密钥
        $arr = array_filter($arr);

        ksort($arr);
        $string = '';
        $string = http_build_query($arr) . $key;
        $sign = md5(urldecode($string));
        $arr['sign'] = $sign;
        $header = array(
            "Content-Type: application/x-www-form-urlencoded"
        );
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        // status
        // 1支付成功，0等待支付
    }

    /**
     * 飞猪支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function feizhu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '912';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['pay_memberid'] = $pay_config['merchant_id'];          // 商户ID
        $arr['pay_orderid'] = $parameters['order_id'];              // 订单号
        $arr['pay_amount'] = $parameters['cash'];                   // 金额
        $arr['pay_applydate'] = date('YmdHis');                     // 订单提交时间
        $arr['pay_bankcode'] = $type;                               // 银行编号 
        $arr['pay_notifyurl'] = $pay_config['notify_url'];          // 服务端返回地址
        $arr['pay_callbackurl'] = $parameters['return_url'];        // 页面返回地址 
        $arr['pay_returntype'] = 2;                                 // 返回方式 1页面直接跳转 2 json格式返回
        $arr['pay_productname'] = $parameters['order_id'];          // 商品名称
        $arr['pay_productnum'] = 1;                                 // 商户品数量 
        $arr['pay_productdesc'] = $parameters['order_id'];          // 商品描述 
        $arr['pay_producturl'] = $parameters['return_url'];         // 商户链接地址 

        $native = array(
            "pay_memberid" => $arr['pay_memberid'],
            "pay_orderid" => $arr['pay_orderid'],
            "pay_amount" => $arr['pay_amount'],
            "pay_applydate" => $arr['pay_applydate'],
            "pay_bankcode" => $arr['pay_bankcode'],
            "pay_notifyurl" => $arr['pay_notifyurl'],
            "pay_callbackurl" => $arr['pay_callbackurl'],
        );

        ksort($native);
        $md5str = "";
        foreach ($native as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = $md5str . "key=" . $pay_config['key'];
        $arr['pay_md5sign'] = strtoupper(md5($sign_str));

        $request_url = $pay_config['request_url'];        // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['pay_url']) && strlen($resarray['data']['pay_url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 飞猪支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function feizhuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['pay_memberid'] = $pay_config['merchant_id'];
        $arr['pay_orderid'] = $order_id;

        $native = array(
            "pay_memberid" => $arr['pay_memberid'],
            "pay_orderid" => $arr['pay_orderid'],
        );

        ksort($native);
        $md5str = "";
        foreach ($native as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = $md5str . "key=" . $pay_config['key'];
        $arr['pay_md5sign'] = strtoupper(md5($sign_str));

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        // NOTPAY（未支付）SUCCESS（已支付）
    }

    /**
     * 紫睿支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function zirui($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr = array(
            'app_id' => $pay_config['merchant_id'], // 必填 商户appid
            'version' => '1.0', // 必填 版本号
            'timestamp' => time(), // 必填 unix时间戳
            'params' => json_encode([
                'out_order_no' => $parameters['order_id'], // 必填 应用平台订单号
                'amount' => intval(strval($parameters['cash'] * 100)), // 必填 支付金额 单位：分
                'pay_type' => $type, // 必填 支付方式 固定填写alipay
                'back_url' => $pay_config['notify_url'], // 必填 后台通知地址
            ])
        );

        $arr['sign'] = md5($arr['app_id'] . $arr['timestamp'] . $arr['version'] . $arr['params'] . $pay_config['key']);

        $request_url = $pay_config['request_url'];        // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['response'])) {
            $response = json_decode($resarray['response'], true);
            if (isset($response['result']['qr_code']) && strlen($response['result']['qr_code']) > 10) {
                // 成功     
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 紫睿支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function ziruiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr = array(
            'app_id' => $pay_config['merchant_id'], // 必填 商户appid
            'version' => '1.0', // 必填 版本号
            'timestamp' => time(), // 必填 unix时间戳
            'params' => json_encode([
                'order_no' => $recharge['other_order_id'], // 必填 订单号 这个是支付接口返回的order_no
                'out_order_no' => $order_id, // 必填 商户订单号
            ])
        );

        $arr['sign'] = md5($arr['app_id'] . $arr['timestamp'] . $arr['version'] . $arr['params'] . $pay_config['key']);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['response'])) {
            $response = json_decode($resarray['response'], true);
            if (isset($response['result']['order_status']) && $response['result']['order_status'] == '1006') {
                // 支付成功
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        // 进行中  1001     支付完成  1006
    }

    /**
     * 平安付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function pinganfupay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = 'HXALISM';
                break;
            case 'alipay_scan_code':
                $paytype = 'HXALISM';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['partner'] = $pay_config['merchant_id'];                        // 商户ID
        $arr['bankcode'] = 'ICBC';                                           // 银行编号
        $arr['banktype'] = $paytype;                                         // 支付类型
        $arr['paymoney'] = sprintf("%.2f", $parameters['cash']);             // 单位元（人民币），2位小数
        $arr['ordernumber'] = $parameters['order_id'];                       // 商户系统订单号
        $arr['callbackurl'] = $pay_config['notify_url'];                     // 下行异步通知地址
        $arr['hrefbackurl'] = $parameters['return_url'];                     // 同步跳转地址
        $arr['attach'] = $parameters['order_id'];                            // 备注消息
        $key = $pay_config['key'];
        $arr['sign'] = md5('partner=' . $arr['partner'] . '&banktype=' . $arr['banktype'] . '&paymoney=' . $arr['paymoney'] . '&ordernumber=' . $arr['ordernumber'] . '&callbackurl=' . $arr['callbackurl'] . $key);

        $request_url = $pay_config['request_url'];                          // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 平安付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function pinganfupayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * Y付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function yfu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = 904;
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['pay_memberid'] = $pay_config['merchant_id'];                    // 商户号
        $arr['pay_orderid'] = $parameters['order_id'];                        // 订单号
        $arr['pay_applydate'] = date("Y-m-d H:i:s");                          // 提交时间
        $arr['pay_bankcode'] = $paytype;                                      // 支付方式
        $arr['pay_notifyurl'] = $pay_config['notify_url'];                    // 服务端通知 
        $arr['pay_callbackurl'] = $pay_config['return_url'];                  // 页面跳转通知
        $arr['pay_amount'] = $parameters['cash'];                             // 商品金额
        ksort($arr);
        $str = "";
        foreach ($arr as $k => $v) {
            $str = $str . $k . '=' . $v . '&';
        }

        $sign = strtoupper(md5($str . 'key=' . $pay_config['key']));

        $arr['pay_md5sign'] = $sign;                                          // MD5签名
        $arr['pay_attach'] = $parameters['order_id'];                         // 附加字段
        $arr['pay_productname'] = $parameters['order_id'];                    // 商品名称
        $arr['pay_productnum'] = 1;                                           // 商户品数量
        $arr['pay_productdesc'] = $parameters['order_id'];                    // 商品描述
        $arr['pay_producturl'] = '';                                          // 商户链接地址

        $request_url = $pay_config['request_url'];                            // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (is_array($resarray) || !$resdata) {
            return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * Y付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yfuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['pay_memberid'] = $pay_config['merchant_id'];    // 商户号
        $arr['pay_orderid'] = $order_id;                      // 订单号
        ksort($arr);
        $str = "";
        foreach ($arr as $k => $v) {
            $str = $str . $k . '=' . $v . '&';
        }

        $sign = strtoupper(md5($str . 'key=' . $pay_config['key']));
        $arr['pay_md5sign'] = $sign;

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          NOTPAY-未支付 SUCCESS已支付
         */
    }

    /**
     * 云付支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function yunfu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '101';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['channel'] = $pay_config['merchant_id'];                       // 渠道号
        $arr['price'] = intval(strval($parameters['cash'] * 100));          // 资费
        $arr['cpparam'] = $parameters['order_id'];                          // 订单号
        $arr['paytype'] = $type;                                            // 业务类型
        $arr['userid'] = rand(100000, 999999);                              // 用户唯一标识
        $arr['ip'] = $parameters['ip'];                                     // 必须是发起支付的客户端的IP
        $arr['callbackurl'] = $parameters['return_url'];                    // 交易完成后跳转的 URL不能带有参数
        $arr['goodsname'] = $parameters['body'];                      // 商品名称

        $key = $pay_config['key'];

        $request_url = $pay_config['request_url'];  // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['url']) && strlen($resarray['url']) > 10) {

            // 成功     
            $verify_param = $resarray['orderid'];
            $url = str_replace("HTTPS", "https", $resarray['url']);
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 云付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yunfuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 榛果支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function zhenguo($parameters = [], $pay_config = [])
    {

        /*
          支付宝扫码	CR_ALI
          支付宝WAP支付	ALI
          微信扫码	CR
          微信WAP	CR_WAP
         */
        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ALI';
                break;
            case 'alipay_scan_code':
                $type = 'CR_ALI';
                break;
            case 'wechat_h5':
                $type = 'CR_WAP';
                break;
            case 'wechat_scan_code':
                $type = 'CR';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merchno'] = $pay_config['merchant_id'];                   // 商户注册签约后，支付平台分配的唯一标识号
        $arr['traceno'] = $parameters['order_id'];                      // 由商户系统生成的唯一订单号，最大长度为32位
        $arr['paytype'] = $type;                                        // 支付方式说明
        $arr['total_fee'] = intval(strval($parameters['cash'] * 100));  // 订单总金额以分为单位
        $arr['notifyurl'] = $pay_config['notify_url'];                  // 通知地址
        $arr['returnurl'] = $parameters['tj_return_url'];               // 支付跳转地址

        ksort($arr);
        $urlval = urldecode(http_build_query($arr));
        $sign = $urlval . '&' . 'key=' . $pay_config['key'];
        $arr['sign'] = strtoupper(md5(md5($sign)));

        $header = array(
            "Accept: application/json",
            "Content-Type: application/json;charset=utf-8",
        );

        $request_url = $pay_config['request_url'];  // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['barUrl']) && strlen($resarray['barUrl']) > 10) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 榛果支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zhenguoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 森发源支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function sfyfu($parameters = [], $pay_config = [])
    {

        /*
          可选的参数是：alipay2（支付宝）、wechat2（微信）、alipay2qr（支付宝，只提供json数据）、wechat2qr（微信，只提供json数据）
         */
        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay2qr';
                break;
            case 'alipay_scan_code':
                $type = 'alipay2';
                break;
            case 'wechat_h5':
                $type = 'wechat2qr';
                break;
            case 'wechat_scan_code':
                $type = 'wechat2';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['pid'] = $pay_config['merchant_id'];                    // 商户ID
        $arr['type'] = $type;                                        // 支付方式
        $arr['out_trade_no'] = $parameters['order_id'];              // 商户订单号
        $arr['notify_url'] = $pay_config['notify_url'];              // 异步通知地址
        $arr['return_url'] = $parameters['tj_return_url'];           // 同步通知地址  
        $arr['name'] = $parameters['order_id'];                      // 商品名称
        $arr['attach'] = date('YmdHis') . rand(100000, 999999);      // 附加数据 
        $arr['money'] = $parameters['cash'];                         // 商品金额
        $arr['sitename'] = '';                                       // 网站名称
        $arr['format'] = 'json';                                     // 返回格式

        $arr = array_filter($arr);
        ksort($arr);
        $string = http_build_query($arr) . $pay_config['key'];

        $arr['sign'] = strtoupper(md5(urldecode($string)));
        $arr['sign_type'] = 'MD5';

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payurl']) && strlen($resarray['payurl']) > 10) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 森发源支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function sfyfuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 百盛嘉支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function bsjpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_scan_code':
                $paytype = 'GYFZFB';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['pay_memberid'] = $pay_config['merchant_id'];                   // 商户ID
        $arr['pay_orderid'] = $parameters['order_id'];                       // 订单号
        $arr['pay_amount'] = sprintf("%.2f", $parameters['cash']);           // 金额
        $arr['pay_applydate'] = date("Y-m-d H:i:s");                         // 订单提交时间
        $arr['pay_bankcode'] = 'ICBC';                                       // 银行编号
        $arr['pay_notifyurl'] = $pay_config['notify_url'];                   // 服务端返回地址
        $arr['pay_callbackurl'] = $parameters['return_url'];                 // 页面返回地址
        $arr['tongdao'] = $paytype;                                          // 指定调用的通道代码
        $arr['pay_reserved1'] = $parameters['order_id'];                     // 扩展字段1
        $arr['pay_reserved2'] = $parameters['order_id'];                     // 扩展字段1
        $arr['pay_reserved3'] = $parameters['order_id'];                     // 扩展字段1
        $arr['pay_productname'] = $parameters['body'];                 // 商品名称
        $arr['pay_productnum'] = 1;                                          // 商户品数量
        $arr['pay_productdesc'] = $parameters['body'];                 // 商品描述
        $arr['pay_producturl'] = '';                                         // 商户链接地址

        $key = $pay_config['key'];
        $arr['pay_md5sign'] = strtoupper(md5('pay_amount=>' . $arr['pay_amount'] . '&pay_applydate=>' . $arr['pay_applydate'] . '&pay_bankcode=>' . $arr['pay_bankcode'] . '&pay_callbackurl=>' . $arr['pay_callbackurl'] . '&pay_memberid=>' . $arr['pay_memberid'] . '&pay_notifyurl=>' . $arr['pay_notifyurl'] . '&pay_orderid=>' . $arr['pay_orderid'] . '&key=' . $key));

        $request_url = $pay_config['request_url'];                           // 请求地址

        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 百盛嘉支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function bsjpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 西西支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function xixipay($parameters = [], $pay_config = [])
    {

        /*
          1006	微信H5支付（正式）	0 ‰	开通
          1069	BLF网关          	0 ‰	开通
          1107	微信扫码(test)   	0 ‰	开通
          1106	微信H5(test)	        0 ‰	开通
          1105	支付宝扫码(test)	0 ‰	开通
          1104	支付宝H5(test)	        0 ‰	开通
          1103	快捷支付(test)    	0 ‰	开通
          1102	网关支付(test)   	0 ‰	开通
         */
        switch ($parameters['type']) {
            case 'alipay_scan_code':
                $paytype = '1105';
                break;
            case 'alipay_h5':
                $paytype = '1104';
                break;
            case 'wechat_scan_code':
                $paytype = '1107';
                break;
            case 'wechat_h5':
                $paytype = '1106';
                break;
            case 'kuaijie':
                $paytype = '924';
                break;
            case 'wangyin':
                $paytype = '1102';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['pay_memberid'] = $pay_config['merchant_id'];                    // 商户ID
        $arr['pay_orderid'] = $parameters['order_id'];                        // 订单号
        $arr['pay_applydate'] = date("Y-m-d H:i:s");                          // 订单提交时间
        $arr['pay_bankcode'] = $paytype;                                      // 银行编号
        $arr['pay_notifyurl'] = $pay_config['notify_url'];                    // 服务端返回地址
        $arr['pay_callbackurl'] = $pay_config['notify_url'];                  // 页面返回地址 
        $arr['pay_amount'] = sprintf("%.2f", $parameters['cash']);            // 金额
        $arr['pay_attach'] = $parameters['order_id'];                         // 附加字段
        $arr['pay_productname'] = $parameters['order_id'];                    // 商品名称
        $key = $pay_config['key'];
        $arr['pay_md5sign'] = strtoupper(md5('pay_amount=' . $arr['pay_amount'] . '&pay_applydate=' . $arr['pay_applydate'] . '&pay_bankcode=' . $arr['pay_bankcode'] . '&pay_callbackurl=' . $arr['pay_callbackurl'] . '&pay_memberid=' . $arr['pay_memberid'] . '&pay_notifyurl=' . $arr['pay_notifyurl'] . '&pay_orderid=' . $arr['pay_orderid'] . '&key=' . $key));

        $request_url = $pay_config['request_url'];                            // 请求地址

        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 西西支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function xixipayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        $arr['pay_memberid'] = $pay_config['merchant_id'];      // 商户ID
        $arr['pay_orderid'] = $order_id;                        // 订单号
        $key = $pay_config['key'];
        $arr['pay_md5sign'] = strtoupper(md5('pay_memberid=' . $arr['pay_memberid'] . '&pay_orderid=' . $arr['pay_orderid'] . '&key=' . $key));

        $request_url = $pay_config['request_url_query'];        // 请求查询地址

        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * ONE支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function onepayment($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = 'T00302';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merCd'] = $pay_config['merchant_id'];         // 必填 商户号
        $arr['versionNo'] = 'V01';                          // 必填 版本号
        $arr['txnCd'] = $paytype;                           // 必填 交易类型    T00100（网银）T00302（支付宝)
        $arr['insCd'] = '';                                 // 选填项 机构号
        $arr['merOrderNo'] = $parameters['order_id'];       // 必填 商户订单号
        $arr['txnSubmitTime'] = date('YmdHis');             // 必填 提交时间
        $arr['txnAmt'] = $parameters['cash'];               // 必填 金额 单位:元
        $arr['txnGoodsName'] = $parameters['order_id'];     // 必填 商品名称 需进行URLEncoder编码
        $arr['txnGoodsDesc'] = $parameters['order_id'];     // 选填项 商品描述 需进行URLEncoder编码
        $arr['txnOrderDesc'] = $parameters['order_id'];     // 选填项 订单描述 需进行URLEncoder编码
        $arr['pageBackUrl'] = $pay_config['return_url'];    // 必填 前台通知地址
        $arr['notifyUrl'] = $pay_config['notify_url'];      // 必填 后台通知地址
        $arr['bankCode'] = '';                              // 选填项 银行简称 参数可为空，但是必须上传此参数；直连时必填，默认填写：不填跳转收银台
        $arr['remarks'] = $parameters['order_id'];          // 选填项 交易备注 需进行URLEncoder编码
        ksort($arr);
        $signStr = urldecode(http_build_query($arr));
        $signature = '';
        $merKey = $pay_config['key'];
        $signature = bin2hex(hash_hmac('sha1', $signStr, $merKey, true));
        $arr['signType'] = 'HmacSHA1';
        $arr['signData'] = $signature;

        $request_url = $pay_config['request_url'];          // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * ONE支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function onepaymentVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 柬易付支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function jianyifu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = '1';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['order_id'] = $parameters['order_id'];                 // 商户的订单号
        $arr['pay_type'] = $paytype;                                // 商户选择的支付方式 1：支付宝，2：微信 
        $arr['body'] = $parameters['body'];             // 商品名称
        $arr['money'] = sprintf("%.2f", $parameters['cash']);       // 金额
        $arr['add_time'] = date('Y-m-d H:i:s');                     // 订单添加时间
        $arr['remark'] = $parameters['order_id'];                   // 订单备注信息
        $arr['callback_url'] = $pay_config['notify_url'];           // 商户异步通知地址

        ksort($arr);
        $str = implode('', $arr);
        $string = $str . $pay_config['key'];

        $sign = sha1($string);

        $arr_json = json_encode($arr, JSON_UNESCAPED_UNICODE);
        $post['appkey'] = $pay_config['merchant_id'];
        $post['data'] = $arr_json;
        $post['sign'] = $sign;

        $request_url = $pay_config['request_url'];                    // 请求地址
        $resdata = go_curl($request_url, $post, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 柬易付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function jianyifuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 中富通支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function zhongfutong($parameters = [], $pay_config = [])
    {
        /*
          支付类型
          QQCode:QQ扫码，
          QQH5：QQH5，
          wechatCode：微信扫码
          wechatH5：微信H5，
          aliCode：支付宝扫码，
          aliH5：支付宝H5，
          B2C：网银支付，
          kuaijie：快捷支付
         */

        switch ($parameters['type']) {
            case 'alipay_h5':
                $paytype = 'aliH5';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = 'V1.0';                                     // 当前接口版本 V1.0 
        $arr['merchantNum'] = $pay_config['merchant_id'];             // 分配给商家的商户号 
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);    // 随机字符串
        $arr['merMark'] = $pay_config['app_id'];                      // 分配给商家的商户标识 
        $arr['client_ip'] = $parameters['ip'];                    // 客户端ip
        $arr['orderTime'] = date("Y-m-d H:i:s");                      // 订单时间
        $arr['payType'] = $paytype;                                   // 支付类型
        $arr['orderNum'] = $parameters['order_id'];                   // 商户订单号（此订单号必须在自定义订单号前拼接商户标识，示例：orderNum =ABC10000,ABC为商户标识）
        $arr['amount'] = intval(strval($parameters['cash'] * 100));   // 订单金额，单位（分）
        $arr['body'] = $parameters['order_id'];                       // 订单描述（当payType为kuaijie，此字段传银行卡号）
        $arr['signType'] = 'MD5';                                     // 签名类型（MD5）不参与签名
        $arr['bank_code'] = '';                                       // payType为B2C时必填，参照附录中的银行代码对照表
        $arr['notifyUrl'] = $pay_config['notify_url'];                // 后台通知地址，如不填则不发送通知


        $key = $pay_config['key'];
        $arr['sign'] = md5('version=' . $arr['version'] . '&merchantNum=' . $arr['merchantNum'] . '&nonce_str=' . $arr['nonce_str'] . '&merMark=' . $arr['merMark'] . '&client_ip=' . $arr['client_ip'] . '&payType=' . $arr['payType'] . '&orderNum=' . $arr['orderNum'] . '&amount=' . $arr['amount'] . '&body=' . $arr['body'] . '&key=' . $key);
        $arr['sign'] = strtoupper($arr['sign']);

        $request_url = $pay_config['request_url'];                           // 请求地址
        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 中富通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zhongfutongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchantNum'] = $pay_config['merchant_id'];             // 分配给商家的商户号 
        $arr['orderNum'] = $order_id;
        $arr['amount'] = 100;                                         // 订单金额，单位（分）
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);    // 随机字符串

        $key = $pay_config['key'];
        $arr['sign'] = md5('merchantNum=' . $arr['merchantNum'] . '&orderNum=' . $arr['orderNum'] . '&amount=' . $arr['amount'] . '&nonce_str=' . $arr['nonce_str'] . '&key=' . $key);
        $arr['sign'] = strtoupper($arr['sign']);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址

        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['orderStatus']) && $resarray['orderStatus'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * pexotc支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function pexotc($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_scan_code':
                $paytype = 'alipay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merchantid'] = $pay_config['merchant_id'];       // 商户 ID：从商户后台获得
        $arr['orderno'] = $parameters['order_id'];             // 商户订单号
        $arr['orderamount'] = $parameters['cash'];             // 支付金额 
        $arr['paytype'] = $paytype;                            // 付款方式(小写英文)：alipay 支付宝，bank 银联卡转账
        $arr['customername'] = '';                             // 付款人姓名：只能中文
        $arr['ordercurrency'] = 'CNY';                         // 购买币种：USDT（泰达币），CNY（人民币） 
        $arr['serverbackurl'] = $pay_config['notify_url'];     // 订单回调通知地址， 
        $arr['callbackurl'] = $parameters['return_url'];       // 支付完成跳转地址， 
        $key = $pay_config['key'];
        $arr['sign'] = md5($arr['merchantid'] . $arr['orderno'] . $arr['orderamount'] . $arr['serverbackurl'] . $arr['callbackurl'] . $key);

        $request_url = $pay_config['request_url'];                    // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * pexotc支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function pexotcVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * yokoy支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function yokoy($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ALIPAY';
                break;
            case 'wechat_h5':
                $type = 'WXPAY';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $random = rand(100000, 999999);

        $arr['merId'] = $pay_config['merchant_id'];                      // 由平台分配的商户号
        $arr['outTradeNo'] = $parameters['order_id'];                    // 商户订单号 
        $arr['body'] = $parameters['body'];                        // 商品名称
        $arr['attach'] = $random;                                        // 用户自定义透传数据，支付通知中原样返回
        $arr['notifyUrl'] = $pay_config['notify_url'];                   // 接收异步通知地址
        $arr['callBackUrl'] = $pay_config['return_url'];                 // 前台回调url
        $arr['totalFee'] = intval(strval($parameters['cash'] * 100));    // 预下单金额，单位：分
        $arr['payType'] = 'H5';                                          // H5(WEB)，PC(pc端)，APP(移动端)。注：payChannel为WXPAY是，不支持H5和APP
        $arr['payChannel'] = $type;                                      // 支付渠道 : ALIPAY（支付宝），WXPAY（微信）
        $arr['nonceStr'] = $random;                                      // 随机字符串
        $arr['userAccount'] = $random;                                   // 用户账号，商户系统用户唯一标识ID

        $key = $pay_config['key'];
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));

        $request_url = $pay_config['request_url'];                        // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payUrl']) && strlen($resarray['data']['payUrl']) > 10) {

            // 成功     
            $verify_param = $resarray['data']['orderNo'];
            $url = $resarray['data']['payUrl'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * yokoy支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yokoyVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merId'] = $pay_config['merchant_id'];        // 由平台分配的商户号
        $arr['outTradeNo'] = $order_id;                    // 商户订单号      
        // $arr['orderNo'] = '';                           // 第三方订单号
        // $arr['payTime'] = time();                       // 支付时间
        $arr['nonceStr'] = date('YmdHis') . rand(100000, 999999);      // 随机字符串

        $key = $pay_config['key'];
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == 'paid') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        // 订单状态：needpay- 待支付；paying- 支付中；paid- 支付成功；error_no_scan_code- 扫码超时；error_no_pay - 已扫码，但支付超时
    }

    /**
     * 信通支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function xintong($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ALIH5';
                break;
            case 'alipay_scan_code':
                $type = 'ALISCAN';
                break;
            case 'wechat_scan_code':
                $type = 'WXSCAN';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $random = rand(100000, 999999);

        $arr['merId'] = $pay_config['merchant_id'];                      // 由平台分配的商户号
        $arr['outTradeNo'] = $parameters['order_id'];                    // 商户订单号 
        $arr['body'] = $parameters['body'];                        // 商品名称
        $arr['attach'] = $random;                                        // 用户自定义透传数据，支付通知中原样返回
        $arr['notifyUrl'] = $pay_config['notify_url'];                   // 接收异步通知地址
        $arr['callBackUrl'] = $pay_config['return_url'];                 // 前台回调url
        $arr['totalFee'] = intval(strval($parameters['cash'] * 100));    // 预下单金额，单位：分
        /*
          支付宝扫码：ALISCAN
          支付宝H5：ALIH5
          微信扫码：WXSCAN
          网银支付：WY
          快捷支付：QUICK
         */
        $arr['payChannel'] = $type;                                      // 支付渠道  
        $arr['ipAddress'] = $parameters['ip'];                           // 用户IP地址
        $arr['nonceStr'] = date('YmdHis') . rand(100000, 999999);        // 随机字符串
        $key = $pay_config['key'];
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));

        $request_url = $pay_config['request_url'];                        // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payUrl']) && strlen($resarray['data']['payUrl']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 信通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function xintongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merId'] = $pay_config['merchant_id'];        // 由平台分配的商户号
        $arr['outTradeNo'] = $order_id;                    // 商户订单号            
        // $arr['orderNo'] = '';                           // 第三方订单号
        // $arr['payTime'] = time();                       // 支付时间
        $arr['nonceStr'] = date('YmdHis') . rand(100000, 999999);      // 随机字符串

        $key = $pay_config['key'];
        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $key;
        $arr['sign'] = strtoupper(md5($string));

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == 'paid') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        // 订单状态：needpay- 待支付；paying- 支付中；paid- 支付成功；error_no_scan_code- 扫码超时；error_no_pay - 已扫码，但支付超时
    }

    /**
     * 新图支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function xintu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'WAP';
                break;
            case 'alipay_scan_code':
                $type = 'WAP';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['appid'] = $pay_config['merchant_id'];                  // 开户时给到商户编码
        $arr['ver'] = '1.0';                                         // 接口版本
        $arr['method'] = 'create';                                   // 请求接口名，固定 create
        $arr['ts'] = time();                                         // 请求时间，时间戳格式 
        $arr['order_no'] = $parameters['order_id'];                  // 商户订单号 
        $arr['amount'] = $parameters['cash'];                        // 订单总金额，单位为元 
        $arr['type'] = $type;                                        // 支付类型，有 2 种 WAP 和QRCODE，默认 WAP     
        $arr['notify_url'] = $pay_config['notify_url'];              // 用于接受支付结果 
        $arr['param'] = date('YmdHis') . rand(100000, 999999);       // 商户扩展信息 

        $arr['secret'] = $pay_config['key'];
        $token = $pay_config['app_id'];
        $arr['sign'] = md5($arr['appid'] . $arr['method'] . $arr['ts'] . $arr['ver'] . 'order_no' . $arr['order_no'] . 'amount' . $arr['amount'] . 'type' . $arr['type'] . 'notify_url' . $arr['notify_url'] . $token);

        $request_url = $pay_config['request_url'];                        // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_url']) && strlen($resarray['pay_url']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 新图支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function xintuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 阿联支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function alianpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay';
                $trade_type = 'wap';
                break;
            case 'alipay_scan_code':
                $type = 'alipay';
                $trade_type = 'native';
                break;
            case 'wechat_h5':
                $type = 'wx';
                $trade_type = 'wap';
                break;
            case 'wechat_scan_code':
                $type = 'wx';
                $trade_type = 'native';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['mch_id'] = $pay_config['merchant_id'];               // 商户号
        $arr['mch_order_id'] = $parameters['order_id'];            // 商户订单号
        $arr['money'] = intval(strval($parameters['cash'] * 100)); // 订单金额 单位为 分
        $arr['pay_type'] = $type;                                  // 支付类型
        $arr['trade_type'] = $trade_type;                          // 支付方式
        $arr['notify_url'] = $pay_config['notify_url'];            // 异步通知url
        $arr['redirect_url'] = $parameters['return_url'];          // 前台通知
        $arr['reserve'] = date('YmdHis') . rand(100000, 999999);   // 原样返回

        $key = $pay_config['key'];
        ksort($arr);
        $string = '';
        $string = http_build_query($arr);
        $string = $string . '&key=' . $key;
        $string = strtoupper(md5(urldecode($string)));

        $arr['sign'] = $string;

        $header = array('Content-Type: application/x-www-form-urlencoded');

        $request_url = $pay_config['request_url'];
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['code']) && $resarray['code'] == 'A000') {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 阿联支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function alianpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {


        $arr['mch_id'] = $pay_config['merchant_id'];        // 商户号
        $arr['mch_order_id'] = $order_id;

        $key = $pay_config['key'];
        ksort($arr);
        $string = '';
        $string = http_build_query($arr);
        $string = $string . '&key=' . $key;
        $string = strtoupper(md5(urldecode($string)));

        $arr['sign'] = $string;

        $header = array('Content-Type: application/x-www-form-urlencoded');

        $request_url = $pay_config['request_url_query'];
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 'S') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 薇支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function vivpayment($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'ZFB';
                break;
            case 'alipay_scan_code':
                $type = 'ZFB';
                break;
            case 'wechat_scan_code':
                $type = 'WX';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['payType'] = 'xypay';                      // 一层支付方式
        $arr['totalAmount'] = $parameters['cash'];      // 用户支付的金额单位元
        $arr['outTradeNo'] = $parameters['order_id'];   // 商户订单中的唯一值，不可重复
        $arr['merchantNumber'] = $pay_config['merchant_id'];  // 系统分配的唯一商户号
        $arr['subject'] = $parameters['body'];    // 商品主题
        $arr['secondPayType'] = $type;                  // 二级支付方式 ZFB:支付宝WX:微信
        $arr['timeStamp'] = time() . '000';             // 13位时间戳
        $arr['notifyUrl'] = $pay_config['notify_url'];  // 系统回调商户的通知地址

        $arr['sign'] = md5('merchantNumber=' . $arr['merchantNumber'] . '&notifyUrl=' . $arr['notifyUrl'] . '&outTradeNo=' . $arr['outTradeNo'] . '&payType=' . $arr['payType'] . '&secondPayType=' . $arr['secondPayType'] . '&subject=' . $arr['subject'] . '&timeStamp=' . $arr['timeStamp'] . '&totalAmount=' . $arr['totalAmount'] . '&key=' . $pay_config['key']);

        $param = json_encode($arr);

        $header = array('Content-Type: application/json', 'Content-Length: ' . strlen($param));
        $request_url = $pay_config['request_url'];      // 请求地址
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['qrCodeAddress']) && strlen($resarray['data']['qrCodeAddress']) > 10) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 薇支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function vivpaymentVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 安全支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function safepay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = '00';
                break;
            case 'alipay_scan_code':
                $type = '04';
                break;
            case 'alipay_h5':
                $type = '04';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['userID'] = $pay_config['merchant_id'];                // 唯一身份标识 
        $arr['orderId'] = $parameters['order_id'];                  // 提交的订单号必须在自身账户交易中唯一
        $arr['amt'] = $parameters['cash'];                          // 不能为空,精确到分
        $arr['bank'] = $type;                                       // 请参照银行代码表 支付宝银行码：04微信银行码：00
        $arr['name'] = rand(10000000, 99999999);                    // 您营业系统支付会员的代号或身份 ID，不可重，不可为汉字 
        $arr['url'] = $pay_config['notify_url'];                    // 支付成功的通知 
        $arr['cur'] = '1';                                          // 固定值：1，代表‘RMB’ 
        $arr['userip'] = $parameters['ip'];                         // 交易会员的客户端 IP 地址 
        $arr['agent'] = 'Mozilla/5.0 (Linux; U; Android 7.1.1; zh-cn; 1607-A01 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36';                // 交易会员的浏览器信息
        //$arr['agent'] = input('server.HTTP_USER_AGENT');
        $arr['attach'] = date('YmdHis') . rand(100000, 999999);     // 商户扩展信息 

        $key = $pay_config['key'];
        $arr['hmac'] = md5($arr['userID'] . '&' . $arr['orderId'] . '&' . $arr['amt'] . '&' . $key);   // 参数签字串（签字内容小写）

        $request_url = $pay_config['request_url'];                 // 请求地址
        //$resdata = go_curl($request_url, $arr, 'get' , $pay_config['wait_second']);
        $urlval = http_build_query($arr);
        $url = $request_url . '?' . $urlval;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);                 // 设置抓取的url
        curl_setopt($ch, CURLOPT_HEADER, false);             // 设置头文件的信息作为数据流输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);         // 设置获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     // 对认证证书来源的检查  
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);                // 尝试连接等待的时间
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);         // TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向
        curl_setopt($ch, CURLOPT_USERAGENT, $arr['agent']);  // 在HTTP请求中包含一个"User-Agent: "头的字符串。

        $resdata = curl_exec($ch);
        curl_close($ch);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 安全支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function safepayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['interfaceID'] = $pay_config['merchant_id'];       // 唯一身份标识 
        $arr['orderID'] = $order_id;                            // 提交的订单号必须在自身账户交易中唯一

        $key = $pay_config['key'];
        $arr['md5Str'] = md5($arr['interfaceID'] . '&' . $arr['orderID'] . '&' . $key);   // 参数签字串（签字内容小写）

        $urlval = http_build_query($arr);
        $url = $pay_config['request_url_query'] . '?' . $urlval;

        $resdata = go_curl($url, '', 'get', $pay_config['wait_second']);
        if ($resdata == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          -1	签字错误或其他严重错误；
          1	已成功；
          2	未成功；
          3	查询目标不存在；
         */
    }

    /**
     * 易付支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function yifu($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 0;
                break;
            case 'alipay_scan_code':
                $type = 0;
                break;
            case 'wechat_h5':
                $type = 1;
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $head = [
            'appId' => 'DEFAULT',
            'version' => '1.0',
            'reqType' => 'h5_pay_request', //接口类型固定
            'mchid' => $pay_config['merchant_id'], //商户ID固定扫码123卡务
            'reqNo' => $parameters['order_id'], //请求流水
            'channel' => $type,
            'clientIp' => $parameters['ip'],
            'backURL' => $pay_config['notify_url']
        ];
        $data = [
            'total_fee' => intval(strval($parameters['cash'] * 100)),
            'device_ip' => $parameters['ip'],
            'subject' => $parameters['order_id'],
        ];

        $all = array_merge($head, $data);
        ksort($all);
        $strsss = '';
        foreach ($all as $keysss => $valuesss) {
            $strsss .= $valuesss;
        }

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN PRIVATE KEY-----\n$temp-----END PRIVATE KEY-----\n";

        //$temp = chunk_split($pay_config['other_public_key'], 64, "\n");
        //$other_public_key = "-----BEGIN PUBLIC KEY-----\n$temp-----END PUBLIC KEY-----\n";


        $res = openssl_pkey_get_private($key);
        if (openssl_sign($strsss, $out, $res, OPENSSL_ALGO_MD5)) {
            //释放资源
        }

        $head['sign'] = base64_encode($out);

        $xml = "<xml><head><appId>{$head['appId']}</appId><version>{$head['version']}</version><reqType>{$head['reqType']}</reqType><mchid>{$head['mchid']}</mchid><reqNo>{$head['reqNo']}</reqNo><channel>{$head['channel']}</channel><clientIp>{$head['clientIp']}</clientIp><backURL>{$head['backURL']}</backURL><sign>{$head['sign']}</sign></head><data><total_fee>{$data['total_fee']}</total_fee><device_ip>{$data['device_ip']}</device_ip><subject>{$data['subject']}</subject></data></xml>";

        $opts = array(
            'http' => array(
                'method' => 'POST',
                'header' => 'content-type:' . 'text/xml',
                'content' => $xml
            )
        );
        $context = stream_context_create($opts);
        ini_set('user_agent', 'Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)');
        $resdata = file_get_contents($pay_config['request_url'], true, $context);

        if (!$resdata) {
            return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($opts, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $resarray = json_decode(json_encode(simplexml_load_string($resdata, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

        if (isset($resarray['head']['respCd']) && $resarray['head']['respCd'] == '0000' && isset($resarray['data']['pay_url'])) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($opts, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($opts, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 易付支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yifuVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['spid'] = $pay_config['merchant_id'];      // 商户号 
        $arr['listid'] = $order_id;                     // 第三方订单号

        $key = $pay_config['key'];
        $arr['sign'] = md5($arr['spid'] . $key . $arr['listid']);
        $arr['sign'] = strtoupper($arr['sign']);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['state']) && in_array($resarray['state'], [2, $pay_config['wait_second'], 4])) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          交易状态
          1-创建未支付；
          2-已支付-待回调；
          3-已支付-回调失败
          4-已支付-已回调；
          5-订单关闭
         */
    }

    /**
     * 支付转账
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function paytransfer($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['merchant_id'] = $pay_config['merchant_id'];              // 商户号
        $arr['merchant_order_id'] = $parameters['order_id'];           // 订单号
        $arr['price'] = $parameters['cash'];                           // 金额
        $arr['type'] = $type;                                          // 支付类型
        $arr['body'] = $parameters['body'];                // 商品名称
        $arr['return_url'] = $parameters['return_url'];                // 同步跳转地址
        $arr['notify_url'] = $pay_config['notify_url'];                // 异步通知地址

        $key = $pay_config['key'];                                     // 密钥
        $arr['sign'] = md5('merchant_id=' . $arr['merchant_id'] . '&merchant_order_id=' . $arr['merchant_order_id'] . '&price=' . $arr['price'] . '&type=' . $arr['type'] . '&return_url=' . $arr['return_url'] . '&notify_url=' . $arr['notify_url'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];                     // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['pay_url']) && strlen($resarray['data']['pay_url']) > 10) {

            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 支付转账，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function paytransferVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $key = $pay_config['key'];
        $arr['merchant_order_id'] = $order_id;
        $arr['sign'] = md5('merchant_order_id=' . $order_id . '&key=' . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == 'settled') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          settled
         */
    }

    /**
     * 付联支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function fulian($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_scan_code':
                $type = 'alipay';
                break;
            case 'alipay_h5':
                $type = 'alipay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merId'] = $pay_config['merchant_id'];                        // 商户号
        $arr['version'] = '1.0.0';                                         // 版本号
        $arr['merOrderNo'] = $parameters['order_id'];                      // 商户订单号
        $arr['orderAmt'] = $parameters['cash'];                            // 订单金额(元)
        $arr['payPlat'] = $type;                                           // 付支付平台目前只支持 alipay
        $arr['orderTitle'] = $parameters['body'];                    // 商品名称
        $arr['orderDesc'] = $parameters['body'];                     // 商品描述
        $arr['callbackUrl'] = $pay_config['return_url'];                   // 支付成功后，从收银台跳到商户的页面
        $arr['notifyUrl'] = $pay_config['notify_url'];                     // 商户后台异步通知url

        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $param = json_encode($arr);
        $request_url = $pay_config['request_url'];                         // 请求地址
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['jumpUrl']) && strlen($resarray['jumpUrl']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 付联支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function fulianVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merId'] = $pay_config['merchant_id'];
        $arr['version'] = '1.0.0';
        $arr['merOrderNo'] = $order_id;
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $param = json_encode($arr);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $param, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payStatus']) && $resarray['payStatus'] == 'S') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          N:支付中 I支付中 S:支付成功 F:支付失败
         */
    }

    /**
     * 多米支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function duomi($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '21';
                break;
            case 'qq_h5':
                $type = '71';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $random = date('YmdHis') . rand(100000, 999999);
        $arr = [
            'data' => [
                'authCode' => '',
                'head' => [
                    'apiVersion' => '1.0',
                    'channelDate' => date('Ymd'), // 渠道日期 yyyyMMdd
                    'channelNo' => '99', // 渠道编号 00-PC， 10-移动端 (Android) 、11- 移动端（IOS）、20-POS 终端 30-售货机 99-渠道商接入
                    'channelSerial' => $parameters['order_id'], // 渠道流水号(订单号)
                    'channelTime' => date('His'), // 渠道时间 hhmmss
                    'channelVersion' => '1.0', // 渠道版本
                    'tranCode' => 'PP1017', // 交易码
                    'userId' => $pay_config['merchant_id'], // 在第三方商户名
                ],
                'openId' => '', // 公众号支付为个人用户在接入方微信公众号下的唯一Id
                'orderAmount' => $parameters['cash'], // 订单金额 元
                'payType' => $type, // 21 支付宝h5  71 QQ支付
                'remark' => $random, // 订单备注
                'spbillCreateIp' => $parameters['ip'], // 用户端真实 ip todo chnage
                'backNoticeUrl' => $pay_config['notify_url'], // 异步通知 URL（仅对主扫、公众号支付、交易等需异步通知的交易生效）
                'pageUrl' => $pay_config['return_url'], // 页面通知地址
            ],
        ];
        $arr_json = json_encode($arr);

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $privatekey = openssl_get_privatekey($key);
        $arr_json_sha = sha1($arr_json);
        $request_sha1 = str_pad($arr_json_sha, 128, "\0", STR_PAD_LEFT);
        openssl_private_encrypt($request_sha1, $sign, $privatekey, OPENSSL_NO_PADDING);
        $sign = bin2hex($sign);

        $header = [
            "Content-type: application/json;charset='utf-8'",
            'Content-Encoding: UTF-8',
            "mercId:{$pay_config['app_id']}",
            'sign: ' . $sign,
        ];
        $request_url = $pay_config['request_url'];         // 请求地址

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request_url);       // 需要获取的 URL 地址
        curl_setopt($ch, CURLOPT_POSTFIELDS, $arr_json);   // 全部数据使用HTTP协议中的 "POST" 操作来发送
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   // FALSE 禁止 cURL 验证对等证书（peer's certificate）
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);   // 设置为 1 是检查服务器SSL证书中是否存在一个公用名,0 为不检查名称
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);       // 设为 TRUE ，将在启用 CURLOPT_RETURNTRANSFER 时，返回原生的（Raw）输出。
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);              // 尝试等待的时间
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        $resdata = curl_exec($ch);
        curl_close($ch);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['qrCodeStr']) && strlen($resarray['qrCodeStr']) > 10) {

            // 成功     
            $verify_param = $random;
            $url = $resarray['qrCodeStr'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 多米支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function duomiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr = [
            'data' => [
                'authCode' => '',
                'head' => [
                    'channelNo' => '99', // 渠道编号
                    'channelTime' => date('His'), // 渠道时间
                    'channelVersion' => '1.0', // 渠道版本号
                    'tranCode' => 'PP1024', // 获取收款记录详情
                    'userId' => $pay_config['merchant_id'], // 在第三方商户名
                ],
                'orderNo' => $order_id // 支付时报文头中的channelSerial字段(根据平台自己的订单号查询) 必填 todo change
            ],
        ];

        $arr_json = json_encode($arr);

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $privatekey = openssl_get_privatekey($key);
        $arr_json_sha = sha1($arr_json);
        $request_sha1 = str_pad($arr_json_sha, 128, "\0", STR_PAD_LEFT);
        openssl_private_encrypt($request_sha1, $sign, $privatekey, OPENSSL_NO_PADDING);
        $sign = bin2hex($sign);

        $header = [
            "Content-type: application/json;charset='utf-8'",
            'Content-Encoding: UTF-8',
            "mercId:{$pay_config['app_id']}",
            'sign: ' . $sign,
        ];

        $request_url = $pay_config['request_url_query'];   // 请求查询地址
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request_url);       // 需要获取的 URL 地址
        curl_setopt($ch, CURLOPT_POSTFIELDS, $arr_json);   // 全部数据使用HTTP协议中的 "POST" 操作来发送
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   // FALSE 禁止 cURL 验证对等证书（peer's certificate）
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);   // 设置为 1 是检查服务器SSL证书中是否存在一个公用名,0 为不检查名称
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);       // 设为 TRUE ，将在启用 CURLOPT_RETURNTRANSFER 时，返回原生的（Raw）输出。
        curl_setopt($ch, CURLOPT_TIMEOUT, $pay_config['wait_second']);              // 尝试等待的时间
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        $resdata = curl_exec($ch);
        curl_close($ch);

        $resarray = json_decode($resdata, true);
        if (isset($resarray['orderStatus']) && $resarray['orderStatus'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          orderStatus
          0	待支付
          1	已支付
         */
    }

    /**
     * 付易通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function fuyitong($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'zfbwap';
                break;
            case 'wechat_h5':
                $type = 'weixinwap';
                break;
            case 'qq_h5':
                $type = 'qqwap';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['mch_id'] = $pay_config['merchant_id'];                      // 分配的商户号
        $arr['total_fee'] = intval(strval($parameters['cash'] * 100));    // 金额（单位分） 
        $arr['out_trade_no'] = $parameters['order_id'];                   // 商户订单号
        /*
          微信H5：weixinwap
          微信扫码：weixinsm
          支付宝H5：zfbwap
          支付宝扫码:zfbsm
          QQH5：qqwap
          QQ扫码：qqsm
          京东H5：jdwap
          京东扫码：jdsm
          银联：yl
         */
        $arr['pay_type'] = $type;
        $arr['body'] = $parameters['body'];                         // 商品名称
        $arr['callback_url'] = $pay_config['return_url'];                 // 支付完成跳转地址
        $arr['notify_url'] = $pay_config['notify_url'];                   // 支付成功服务器通知地址
        $arr['deviceIp'] = $parameters['ip'];                             // 客户端发起IP地址
        $arr['attach'] = date('YmdHis') . rand(10000000, 99999999);       // 商户自定义备注

        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $request_url = $pay_config['request_url'];                        // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payInfo']) && strlen($resarray['payInfo']) > 10) {

            // 成功     
            $verify_param = $arr['attach'];
            $url = $resarray['payInfo'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 付易通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function fuyitongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['mch_id'] = $pay_config['merchant_id'];        // 分配的商户号 
        $arr['out_trade_no'] = $order_id;                   // 商户订单号

        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $request_url = $pay_config['request_url_query'];    // 请求查询地址

        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          status
          0	待支付
          1	已支付
         */
    }

    /**
     * 兆行支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function zhaohang($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '1';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['price'] = $parameters['cash'];                           // 交易金额
        $arr['mchNo'] = $pay_config['merchant_id'];                    // 商户id 
        $arr['type'] = $type;                                          // 1=支付宝
        $arr['remarks'] = date('YmdHis') . rand(10000000, 99999999);   // 备注信息
        //$arr['account'] ='';                                         // 设备号
        $arr['orderCode'] = $parameters['order_id'];                   // 商户订单号
        $arr['ts'] = time() . '000';                                   // 单位毫秒
        $arr['notifyUrl'] = $pay_config['notify_url'];                 // 交易成功后通知地址

        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'token=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $str = '';
        foreach ($arr as $keys => $values) {
            $str .= $keys . '=' . urlencode($values) . '&';
        }
        $get_str = substr($str, 0, -1);

        $request_url = $pay_config['request_url'] . '?' . $get_str;    // 请求地址
        $resdata = go_curl($request_url, '', 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payUrl']) && strlen($resarray['data']['payUrl']) > 10) {

            // 成功     
            $verify_param = $arr['remarks'];
            $url = $resarray['data']['payUrl'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 兆行支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zhaohangVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['mchNo'] = $pay_config['merchant_id'];        // 分配的商户号 
        $arr['orderCode'] = $order_id;                     // 商户订单号
        $arr['ts'] = time() . '000';                       // 单位毫秒

        ksort($arr);

        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = $string . 'token=' . $pay_config['key'];
        $arr['sign'] = md5($string);

        $request_url = $pay_config['request_url_query'];    // 请求查询地址

        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] > 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
         * 0=设备返回支付链接失败；
         * 1=支付地址返回成功，等待付款；
         * 2=交易成功；
         * 3=通知失败；
         * 注：status=2或3都是用户支付成功，
         * 3说明回调通知没有返回success
         */
    }

    /**
     * 小差事支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function xiaochaishi($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $arr['partner_no'] = $pay_config['merchant_id'];                            // 商户号
        $arr['partner_order_money'] = intval(strval($parameters['cash'] * 100));    // 订单金额
        $arr['partner_order_no'] = $parameters['order_id'];                         // 商户订单号
        $arr['notify_url'] = $pay_config['notify_url'];                             // 回调地址
        $key = $pay_config['key'];
        $arr['sign'] = md5($arr['partner_no'] . '&' . $arr['partner_order_money'] . '&' . $arr['partner_order_no'] . '&' . $key);

        $request_url = $pay_config['request_url'];    // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payUrl']) && strlen($resarray['payUrl']) > 10) {

            // 成功     
            $verify_param = $resarray['order_no'];
            $url = $resarray['payUrl'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 小差事支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    第三方订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function xiaochaishiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['partner_no'] = $pay_config['merchant_id'];  // 商户号
        $arr['order_no'] = $order_id;                     // 订单号

        $key = $pay_config['key'];
        $arr['sign'] = md5($arr['order_no'] . '&' . $arr['partner_no'] . '&' . $key);

        $request_url = $pay_config['request_url_query'];    // 请求查询地址

        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['payment_status']) && $resarray['payment_status'] == 1) {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 绿洲支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function luzhou($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '00021';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['versionId'] = '1.1';                                          // 版本号
        $arr['orderAmount'] = intval(strval($parameters['cash'] * 100));    // 订单金额以分为单位
        $arr['orderDate'] = date('YmdHis');                                 // 订单日期
        $arr['currency'] = 'RMB';                                           // 货币类型
        $arr['transType'] = '0008';                                         // 交易类别默认填写 0008
        $arr['asynNotifyUrl'] = $pay_config['notify_url'];                  // 异步通知URL
        $arr['synNotifyUrl'] = $parameters['return_url'];                   // 针对该交易的交易状态同步通知接收URL
        $arr['signType'] = 'MD5';                                           // 加密方式
        $arr['merId'] = $pay_config['merchant_id'];                         // 商户编号 todo change
        $arr['prdOrdNo'] = $parameters['order_id'];                         // 商户订单号
        $arr['payMode'] = $type;                                            // 支付方式00021-支付宝扫码 默认
        $arr['receivableType'] = 'D00';                                     // 到账类型 t+1: T01 D+0:D00
        $arr['prdAmt'] = intval(strval($parameters['cash'] * 100));         // 商品价格,单位为分
        $arr['prdDisUrl'] = $arr['synNotifyUrl'];                           // 商品展示网址
        $arr['prdName'] = $parameters['body'];                        // 商品名称
        $arr['prdShortName'] = $parameters['body'];                   // 商品简称
        $arr['prdDesc'] = $parameters['body'];                        // 商品描述
        ksort($arr);

        $string = urldecode(http_build_query($arr));
        $string = $string . '&key=' . $pay_config['key'];
        $sign = strtoupper(md5($string));
        $string = $string . '&signData=' . $sign;

        $request_url = $pay_config['request_url'];    // 请求地址
        $resdata = go_curl($request_url, $string, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['qrcode']) && strlen($resarray['qrcode']) > 10) {

            // 成功     
            $verify_param = $resarray['platmerord'];
            $url = $resarray['qrcode'];
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 绿洲支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function luzhouVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['versionId'] = '1.1';                   // 版本号
        $arr['signType'] = 'MD5';                    // 加密方式
        $arr['merId'] = $pay_config['merchant_id'];  // 商户编号 todo change
        $arr['prdOrdNo'] = $order_id;                // 商户订单号
        ksort($arr);
        $string = urldecode(http_build_query($arr));
        $string = $string . '&key=' . $pay_config['key'];
        $sign = strtoupper(md5($string));
        $string = $string . '&signData=' . $sign;

        $request_url = $pay_config['request_url_query'];    // 请求查询地址
        $resdata = go_curl($request_url, $string, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['orderStatus']) && $resarray['orderStatus'] == '01') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          交易订单: 00 未支付      01 支付成功  02 银行处理中 14 冻结        19 待处理
          代付订单: 00 代付失败    01 已完成    14 冻结       21 银行处理中  22 退还支付账户
         */
    }

    /**
     * 保盈支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function baoying($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                break;
            case 'wechat_h5':
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['cpid'] = $pay_config['merchant_id'];                     // 商户id
        $arr['amount'] = $parameters['cash'];                          // 订单金额不能小于5元                			参与签名
        $arr['product'] = $parameters['order_id'];                     // 产品名 最好传英文字符              			参与签名 
        $arr['orderid'] = $parameters['order_id'];                     // 订单号                         
        $arr['describe'] = $parameters['order_id'];                    // 产品描述 建议传订单号方便查询       			参与签名                  
        $arr['synurl'] = $pay_config['notify_url'];                    // 通知地址      
        $arr['jumpurl'] = $pay_config['notify_url'];                   // 支付成功或失败跳转地址   

        $needSignParam = array(
            "cpid" => $arr['cpid'],
            "amount" => $arr['amount'],
            "product" => $arr['product'],
            "orderid" => $arr['orderid'],
            "describe" => $arr['describe'],
            "synurl" => $arr['synurl']
        );
        ksort($needSignParam);
        $signparams = join($needSignParam, "|") . "|" . $pay_config['key'];
        $sign = md5($signparams);

        $arr['sign'] = $sign;
        $arr['ip'] = $parameters['ip'];

        $request_url = $pay_config['request_url'];                     // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);

        if (isset($resarray['payurl']) && strlen($resarray['payurl']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 保盈支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function baoyingVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['fxid'] = $pay_config['merchant_id'];        // 由平台分配的商户号
        $arr['fxddh'] = $order_id;                        // 商户订单号            
        $arr['fxaction'] = 'orderquery';

        $key = $pay_config['key'];
        $arr['fxsign'] = md5($arr['fxid'] . $arr['fxddh'] . $arr['fxaction'] . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['fxstatus']) && $resarray['fxstatus'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 尚和支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function shanghe($parameters = [], $pay_config = [])
    {
        /*
          支付宝预下单  alipay.h5.prepay
          微信预下单    wechat.h5.prepay
          QQ预下单      qq.h5.prepay
          银联云闪付    union.h5.prepay
          支付宝正扫    alipay.prepay.scan
          微信公众号    wechat.pub.order.create
         */
        /*
          支付渠道：
          alipay-支付宝
          wechat-微信
          wechat_pub-微信公众号
          qqpay-qq支付
          jdpay-京东支付
         */
        switch ($parameters['type']) {
                // H5
            case 'wechat_h5':
                $type = 'wechat.h5.prepay';
                $channel = 'h5';
                break;
            case 'alipay_h5':
                $type = 'alipay.h5.prepay';
                $channel = 'h5';
                break;
            case 'qq_h5':
                $type = 'qq.h5.prepay';
                $channel = 'h5';
                break;
            case 'kuaijie':
                $type = 'union.h5.prepay';
                $channel = 'h5';
                break;
            case 'wechat_mp':
                $type = 'wechat.pub.order.create';
                $channel = 'h5';
                break;
                // 扫码
            case 'alipay_scan_code':
                $type = 'alipay';
                $channel = 'scan_code';
                break;
            case 'wechat_scan_code':
                $type = 'wechat';
                $channel = 'scan_code';
                break;
            case 'wechat_mp':
                $type = 'wechat_pub';
                $channel = 'scan_code';
                break;
            case 'qq_h5':
                $type = 'qqpay';
                $channel = 'scan_code';
                break;
            case 'jd_h5':
                $type = 'jdpay';
                $channel = 'scan_code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                     // 当前接口版本 1.0	
        $arr['org_no'] = $pay_config['app_id'];                      // 分配给商家的机构号
        $arr['mchid'] = $pay_config['merchant_id'];                  // 分配给商家的商户号
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);   // 随机字符串
        $arr['user_ip'] = $parameters['ip'];                         // 客户端ip
        $arr['timestamp'] = time() * 1000;                           // 时间戳，传了订单有效时间上下10min，从1970年1月1日0时到现在的毫秒数

        $arr['out_trade_no'] = $parameters['order_id'];              // 交易订单号
        $arr['total_fee'] = $parameters['cash'];                     // 交易金额，以元为单位
        $arr['body'] = $parameters['body'];                    // 商品名称
        $arr['meta_option'] = '{"s":"WAP","n":"baidu","id":"www.baidu.com"}';
        $arr['return_url'] = $parameters['return_url'];              // 支付成功前台跳转页面?
        $arr['notify_url'] = $pay_config['notify_url'];              // 支付成功后后端异步通知地址

        $key = $pay_config['key'];

        if ($channel == 'scan_code') {
            $arr['method'] = 'api.combine.prepay.create';            // 支付类型 
            $arr['pay_channel'] = $type;                             // 支付渠道
            //(version,method,org_no,mchid,out_trade_no,total_fee,user_ip,nonce_str,timestamp,key)
            $sign_str = 'version=' . $arr['version'] . '&method=' . $arr['method'] . '&org_no=' . $arr['org_no'] . '&mchid=' . $arr['mchid'] . '&out_trade_no=' . $arr['out_trade_no'] . '&total_fee=' . $arr['total_fee'] . '&pay_channel=' . $arr['pay_channel'] . '&user_ip=' . $arr['user_ip'] . '&nonce_str=' . $arr['nonce_str'] . '&timestamp=' . $arr['timestamp'] . '&key=' . $key;
        } else {
            $arr['method'] = $type;                                  // 支付类型  
            //(version,method,org_no,mchid,out_trade_no,total_fee,user_ip,nonce_str,timestamp,key)
            $sign_str = 'version=' . $arr['version'] . '&method=' . $arr['method'] . '&org_no=' . $arr['org_no'] . '&mchid=' . $arr['mchid'] . '&out_trade_no=' . $arr['out_trade_no'] . '&total_fee=' . $arr['total_fee'] . '&user_ip=' . $arr['user_ip'] . '&nonce_str=' . $arr['nonce_str'] . '&timestamp=' . $arr['timestamp'] . '&key=' . $key;
        }

        $arr['sign'] = md5($sign_str);

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if ($channel == 'scan_code') {
            if (isset($resarray['resp_code']) && $resarray['resp_code'] == 'S') {
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }

        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 尚和支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function shangheVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        /*
          查询
          支付宝预下单  alipay.h5.prepay.query
          微信预下单    wechat.h5.prepay.query
          QQ预下单      qq.h5.prepay.query
          银联云闪付    union.h5.prepay.query
          支付宝正扫    alipay.prepay.scan.query
          微信公众号    wechat.pub.order.create.query
         */
        switch ($recharge['type']) {
                // H5
            case 'wechat_h5':
                $type = 'wechat.h5.prepay.query';
                break;
            case 'alipay_h5':
                $type = 'alipay.h5.prepay.query';
                break;
            case 'qq_h5':
                $type = 'qq.h5.prepay.query';
                break;
            case 'kuaijie':
                $type = 'union.h5.prepay.query';
                break;
            case 'wechat_mp':
                $type = 'wechat.pub.order.create.query';
                break;
                // 扫码
            case 'alipay_scan_code':
                $type = 'api.combine.prepay.query';
                break;
            case 'wechat_scan_code':
                $type = 'api.combine.prepay.query';
                break;
            case 'wechat_mp':
                $type = 'api.combine.prepay.query';
                break;
            case 'jd_h5':
                $type = 'api.combine.prepay.query';
                break;
            case 'qq_h5':
                $type = 'api.combine.prepay.query';
                break;
            default:
                return false;
        }

        $arr['version'] = '1.0';                                     // 当前接口版本 1.0	
        $arr['org_no'] = $pay_config['app_id'];                      // 分配给商家的机构号
        $arr['mchid'] = $pay_config['merchant_id'];                  // 分配给商家的商户号
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);   // 随机字符串
        $arr['user_ip'] = '8.8.8.8';                                 // 客户端ip
        $arr['timestamp'] = time() * 1000;                           // 时间戳，传了订单有效时间上下10min，从1970年1月1日0时到现在的毫秒数

        $arr['method'] = $type;                                      // 支付类型
        $arr['out_trade_no'] = $order_id;                            // 交易订单号
        $arr['total_fee'] = '10';                                    // 交易金额，以元为单位
        $arr['body'] = '商品名称';                                   // 商品名称
        $arr['meta_option'] = '{"s":"WAP","n":"baidu","id":"www.baidu.com"}';
        $arr['return_url'] = $pay_config['return_url'];              // 支付成功前台跳转页面?
        $arr['notify_url'] = $pay_config['notify_url'];              // 支付成功后后端异步通知地址

        $key = $pay_config['key'];

        //(version,method,org_no,mchid,out_trade_no,user_ip,nonce_str,timestamp,key)
        $sign_str = 'version=' . $arr['version'] . '&method=' . $arr['method'] . '&org_no=' . $arr['org_no'] . '&mchid=' . $arr['mchid'] . '&out_trade_no=' . $arr['out_trade_no'] . '&user_ip=' . $arr['user_ip'] . '&nonce_str=' . $arr['nonce_str'] . '&timestamp=' . $arr['timestamp'] . '&key=' . $key;
        $arr['sign'] = md5($sign_str);

        $request_url = $pay_config['request_url_query'];    // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'S') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 畅汇支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function changhui($parameters = [], $pay_config = [])
    {

        /*
          WEIXIN	微信
          OnlinePay	网银支付
          Nocard_H5	快捷支付h5
          QQ            QQ钱包
          JDPAY         京东钱包
          UnionPay	银联扫码
          WEIXINWAP	微信WAP
          QQWAP	        QQWAP
          WX_CASHIER	微信扫码收银台
          ALIPAYWAP	支付宝WAP
         */
        switch ($parameters['type']) {
            case 'wechat_h5':
                $paytype = 'WEIXINWAP';
                break;
            case 'alipay_h5':
                $paytype = 'ALIPAYWAP';
                break;
            case 'kuaijie':
                $paytype = 'Nocard_H5';
                break;
            case 'qq_h5':
                $paytype = 'QQWAP';
                break;
            case 'jd_h5':
                $paytype = 'JDPAY';
                break;
            case 'wangyin':
                $paytype = 'OnlinePay';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['p0_Cmd'] = 'Buy';                                               // 固定值“Buy” .
        $arr['p1_MerId'] = $pay_config['merchant_id'];                        // 商户号
        $arr['p2_Order'] = $parameters['order_id'];                           // 商户号订单号不超过30
        $arr['p3_Cur'] = 'CNY';                                               // 交易币种:固定值“CNY”
        $arr['p4_Amt'] = $parameters['cash'];                                 // 金额（元） 
        $arr['p5_Pid'] = urlencode($parameters['body']);                // 商品名称此参数如用到中文，请注意转码.
        $arr['p6_Pcat'] = $arr['p5_Pid'];                                     // 商品种类. 此参数如用到中文，请注意转码.
        $arr['p7_Pdesc'] = $arr['p5_Pid'];                                    // 商品描述. 此参数如用到中文，请注意转码.
        $arr['p8_Url'] = $pay_config['notify_url'];                           // 支付成功页面通知地址
        $arr['p9_MP'] = $parameters['order_id'];                              // 附加参数                                     //  返回时原样返回，此参数如用到中文，请注意转码.

        $arr['pa_FrpId'] = $paytype;                                          // 此字段区分支付方式，含微信扫码支付，网银支付，支付宝扫码支付，快捷支付等
        $arr['pg_BankCode'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';    // 银行编号 具体银行编码建附录，网银支付时必传
        $arr['ph_Ip'] = $parameters['ip'];                                    // 请求ip
        $arr['pi_Url'] = $parameters['return_url'];                           // 同步                                         // 同步返回地址

        $key = $pay_config['key'];    // 密钥
        $array_values = array_values($arr);

        $v = implode('', $array_values);
        $arr['hmac'] = hash_hmac('md5', $v, $key);

        $request_url = $pay_config['request_url'];                            // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        if (strlen($resdata) > 1000) {
            // 成功(认为是网页)
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 畅汇支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function changhuiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr = [
            'p0_Cmd' => 'QueryOrdDetail',
            'p1_MerId' => $pay_config['merchant_id'],
            'p2_Order' => $order_id,
        ];

        $key = $pay_config['key'];    // 密钥
        $array_values = array_values($arr);

        $v = implode('', $array_values);
        $arr['hmac'] = hash_hmac('md5', $v, $key);
        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['rb_PayStatus']) && $resarray['rb_PayStatus'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          INIT：未支付
          SUCCESS：支付成功
          CANCELED：取消
         */
    }

    /**
     * 汇通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function huitong($parameters = [], $pay_config = [])
    {

        $key = $pay_config['key'];                              // 密钥
        $arr['amount'] = intval(strval($parameters['cash'] * 100));             // 金额（单位为分），非空
        $arr['backurl'] = $parameters['return_url'];            // 支付结束跳转地址，非空
        $arr['desc'] = $parameters['body'];               // 商品描述，200位以内，可以为空
        $arr['extra'] = date('YmdHis') . rand(600000, 999999);  // 额外参数，64位以内，可以为空
        $arr['merch'] = $pay_config['merchant_id'];             // 商户id，平台分配
        $arr['notifyurl'] = $pay_config['notify_url'];          // 同步地址，非空
        $arr['product'] = $parameters['body'];            // 商品名称，20位以内，非空
        // 支付场景 , （微信公众号1  微信扫码为2  微信H5为12   微信原生H5为4   支付宝H5为7   二码合一为8，QQ钱包H5=9，QQ钱包扫码=11  快捷支付=13，网关支付=14，支付宝固定H5=21 ）
        switch ($parameters['type']) {
            case 'wechat_h5':
                $arr['type'] = 12;
                break;
            case 'alipay_h5':
                $arr['type'] = 7;
                break;
            case 'kuaijie':
                $arr['type'] = 13;
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }
        $urlval = http_build_query($arr);
        $arr['sign'] = md5(urldecode($urlval . "&key=" . $key));    // MD5后的校验字段,上面的数组顺序固定。
        $arr['iP'] = $parameters['ip'];
        $url = $pay_config['request_url'];                          // 接口请求地址	
        $resdata = go_curl($url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['err']) && $resarray['err'] == 0) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        // 失败
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 汇通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huitongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '无查询接口', 'data' => '无查询接口'];
    }

    /**
     * 双银支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function shuangyin($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay_h5';
                break;
            case 'alipay_scan_code':
                $type = 'alipay_scan_code';
                break;
            case 'wechat_h5':
                $type = 'wechat_h5';
                break;
            case 'wechat_scan_code':
                $type = 'wechat_scan_code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                     // 版本号
        $arr['merchant_id'] = $pay_config['merchant_id'];            // 商户号
        $arr['merchant_order_id'] = $parameters['order_id'];         // 商户订单号
        $arr['app_id'] = 0;                                          // 应用id
        $arr['cash'] = $parameters['cash'];                          // 金额（元） 
        $arr['type'] = $type;                                        // 支付类型 wechat_h5 alipay_h5 wangyin kuaijie
        $arr['trade_type'] = 'consumption';                          // 交易类型
        $arr['body'] = $parameters['body'];              // 商品名称
        $arr['return_url'] = $parameters['tj_return_url'];           // 支付完成跳转地址
        $arr['notify_url'] = $pay_config['notify_url'];              // 支付成功服务器通知地址
        $arr['ip'] = $parameters['ip'];                              // 客户端发起IP地址
        $arr['user_id'] = $parameters['user_id'];                    // 用户ID，默认0，请勿随机
        $arr['business_type'] = 'B2C';                               // 业务类型：B2C:个人支付，B2B:企业支付：网银接口需要
        $arr['bank_code'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';  // 银行编号：查看银行编号：网银接口需要:比如ICBC
        $arr['format'] = 'json';                                     // 返回格式
        $arr['sign_type'] = 'md5';                                   // 签名类型
        $arr['extra'] = date('YmdHis') . rand(100000, 999999);       // 商户自定义备注（原样返回）
        $arr['start_time'] = time();                                 // 当前时间戳:比如1531275552
        $arr['random_string'] = rand(100000, 999999);                // 随机字符串（每次不一样）
        $key = $pay_config['key'];
        $arr['sign'] = md5('merchant_id=' . $arr['merchant_id'] . '&merchant_order_id=' . $arr['merchant_order_id'] . '&cash=' . $arr['cash'] . '&type=' . $arr['type'] . '&return_url=' . $arr['return_url'] . '&notify_url=' . $arr['notify_url'] . '&ip=' . $arr['ip'] . '&start_time=' . $arr['start_time'] . '&random_string=' . $arr['random_string'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_url']) && strlen($resarray['pay_url']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 双银支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function shuangyinVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchant_id'] = $pay_config['merchant_id'];        // 商户号
        $arr['merchant_order_id'] = $order_id;                   // 商户订单号
        $arr['class'] = 0;                                       // 查询类型：支付订单查询接口0，银行卡代付1，支付宝代付2
        $arr['start_time'] = time();                             // 当前时间戳:比如1531275552
        $arr['random_string'] = rand(100000, 999999);            // 随机字符串（每次不一样）
        $key = $pay_config['key'];
        $arr['sign'] = md5('merchant_id=' . $arr['merchant_id'] . '&merchant_order_id=' . $arr['merchant_order_id'] . '&class=' . $arr['class'] . '&start_time=' . $arr['start_time'] . '&random_string=' . $arr['random_string'] . '&key=' . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', 3);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '2') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /* 1 待支付   2	成功   3 失败 */
    }

    /**
     * 多银支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function duoyin($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay_h5';
                break;
            case 'alipay_scan_code':
                $type = 'alipay_scan_code';
                break;
            case 'wechat_h5':
                $type = 'wechat_h5';
                break;
            case 'wechat_scan_code':
                $type = 'wechat_scan_code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['version'] = '1.0';                                     // 版本号
        $arr['merchant_id'] = $pay_config['merchant_id'];            // 商户号
        $arr['merchant_order_id'] = $parameters['order_id'];         // 商户订单号
        $arr['app_id'] = 0;                                          // 应用id
        $arr['cash'] = $parameters['cash'];                          // 金额（元） 
        $arr['type'] = $type;                                        // 支付类型 wechat_h5 alipay_h5 wangyin kuaijie
        $arr['trade_type'] = 'consumption';                          // 交易类型
        $arr['body'] = $parameters['body'];              // 商品名称
        $arr['return_url'] = $parameters['tj_return_url'];           // 支付完成跳转地址
        $arr['notify_url'] = $pay_config['notify_url'];              // 支付成功服务器通知地址
        $arr['ip'] = $parameters['ip'];                              // 客户端发起IP地址
        $arr['user_id'] = $parameters['user_id'];                    // 用户ID，默认0，请勿随机
        $arr['business_type'] = 'B2C';                               // 业务类型：B2C:个人支付，B2B:企业支付：网银接口需要
        $arr['bank_code'] = isset($parameters['bank_code']) ? $parameters['bank_code'] : '';  // 银行编号：查看银行编号：网银接口需要:比如ICBC
        $arr['format'] = 'json';                                     // 返回格式
        $arr['sign_type'] = 'md5';                                   // 签名类型
        $arr['extra'] = date('YmdHis') . rand(100000, 999999);       // 商户自定义备注（原样返回）
        $arr['start_time'] = time();                                 // 当前时间戳:比如1531275552
        $arr['random_string'] = rand(100000, 999999);                // 随机字符串（每次不一样）
        $key = $pay_config['key'];
        $arr['sign'] = md5('merchant_id=' . $arr['merchant_id'] . '&merchant_order_id=' . $arr['merchant_order_id'] . '&cash=' . $arr['cash'] . '&type=' . $arr['type'] . '&return_url=' . $arr['return_url'] . '&notify_url=' . $arr['notify_url'] . '&ip=' . $arr['ip'] . '&start_time=' . $arr['start_time'] . '&random_string=' . $arr['random_string'] . '&key=' . $key);

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_url']) && strlen($resarray['pay_url']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 多银支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function duoyinVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchant_id'] = $pay_config['merchant_id'];        // 商户号
        $arr['merchant_order_id'] = $order_id;                   // 商户订单号
        $arr['class'] = 0;                                       // 查询类型：支付订单查询接口0，银行卡代付1，支付宝代付2
        $arr['start_time'] = time();                             // 当前时间戳:比如1531275552
        $arr['random_string'] = rand(100000, 999999);            // 随机字符串（每次不一样）
        $key = $pay_config['key'];
        $arr['sign'] = md5('merchant_id=' . $arr['merchant_id'] . '&merchant_order_id=' . $arr['merchant_order_id'] . '&class=' . $arr['class'] . '&start_time=' . $arr['start_time'] . '&random_string=' . $arr['random_string'] . '&key=' . $key);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', 3);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == '2') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /* 1 待支付   2	成功   3 失败 */
    }

    /**
     * 富支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function fpay($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '14';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['trade_no'] = $parameters['order_id'];                 // 商户订单号
        $arr['channel'] = $type;                                    // 二维码类型
        $arr['money'] = intval(strval($parameters['cash'] * 100));  // 金额 分
        $arr['shop_id'] = $pay_config['merchant_id'];               // 商户ID号
        $arr['tzurl'] = $pay_config['notify_url'];                  // 异步通知地址

        ksort($arr);
        $string = http_build_query($arr);
        $string = $string . "&token=" . $pay_config['key'];
        $arr['sign'] = md5(strtolower($string));

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['url']) && strlen($resarray['data']['url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 富支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function fpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['trade_no'] = $order_id;                       // 商户订单号
        $arr['shop_id'] = $pay_config['merchant_id'];       // 商户ID号

        ksort($arr);
        $string = http_build_query($arr);
        $string = $string . "&token=" . $pay_config['key'];
        $arr['sign'] = md5(strtolower($string));

        $request_url = $pay_config['request_url_query'];    // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['status']) && $resarray['data']['status'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 蚁窝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function yiwo($parameters = [], $pay_config = [])
    {

        /*
          微信转账:1
          支付宝转账:2
          银行卡转账:3
          支付宝h5收款:4
          云闪付:5
          支付宝H52:6
          支付宝转银行卡:7
         */
        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = '1';
                break;
            case 'wechat_scan_code':
                $type = '1';
                break;
            case 'alipay_h5':
                $type = '4';
                break;
            case 'alipay_scan_code':
                $type = '2';
                break;
            case 'unionpay_scan_code':
                $type = '5';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        if ($pay_config['other_one'] == 1) {
            if ($parameters['type'] == 'alipay_scan_code') {
                $type = '7';
            }
        }

        if ($pay_config['other_one'] == 2) {
            if ($parameters['type'] == 'alipay_h5') {
                $type = '2';
            }
        }

        $arr['pay_memberid'] = $pay_config['merchant_id'];       // 商户ID
        $arr['pay_orderid'] = $parameters['order_id'];           // 订单号
        $arr['price'] = $parameters['cash'];                     // 金额 
        $arr['class'] = $type;                                   // 支付通道 
        $arr['addtime'] = time();                                // 订单提交时间
        $arr['pay_notifyurl'] = $pay_config['notify_url'];       // 服务端返回地址
        $arr['pay_callbackurl'] = $parameters['tj_return_url'];  // 页面返回地址 

        ksort($arr);
        $md5str = "";
        foreach ($arr as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = $md5str . "key=" . $pay_config['key'];

        $sign = strtoupper(md5($sign_str));
        $arr['md5sign'] = $sign;                                 // MD5签名字段 

        $request_url = $pay_config['request_url'];               // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['pay_url']) && strlen($resarray['data']['pay_url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 蚁窝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yiwoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['pay_memberid'] = $pay_config['merchant_id'];  // 商户ID
        $arr['pay_orderid'] = $order_id;                    // 订单号

        ksort($arr);
        $md5str = "";
        foreach ($arr as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = $md5str . "key=" . $pay_config['key'];

        $sign = strtoupper(md5($sign_str));

        $arr['pay_md5sign'] = $sign;

        $request_url = $pay_config['request_url_query'];    // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['pay_status']) && $resarray['data']['pay_status'] == '3') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /* ‘1’为待匹配‘2’为待付款‘3’为交易成功‘4’为交易取消 */
    }

    /**
     * 天诚支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function tiancheng($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_h5':
                $type = 'wph5';
                break;
            case 'wechat_scan_code':
                $type = 'wp';
                break;
            case 'alipay_h5':
                $type = 'aph5';
                break;
            case 'alipay_scan_code':
                $type = 'ap';
                break;
            case 'unionpay_scan_code':
                $type = 'wy';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merchant'] = $pay_config['merchant_id'];                // 商户号
        $arr['qrtype'] = $type;                                       // 支付类型
        $arr['customno'] = $parameters['order_id'];                   // 订单号
        $arr['money'] = $parameters['cash'];                          // 金额  
        $arr['sendtime'] = time();                                    // 订单时间  
        $arr['notifyurl'] = $pay_config['notify_url'];                // 异步通知地址  
        $arr['backurl'] = $parameters['tj_return_url'];               // 回调地址
        $arr['risklevel'] = '';                                       // 风险级别

        $md5str = "";
        foreach ($arr as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = rtrim($md5str, "&") . $pay_config['key'];

        $arr['sign'] = md5($sign_str);

        $request_url = $pay_config['request_url'];                    // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 天诚支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function tianchengVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchant'] = $pay_config['merchant_id'];                // 商户号 
        $arr['customno'] = $order_id;                                 // 订单号 
        $arr['sendtime'] = time();                                    // 订单时间  

        $md5str = "";
        foreach ($arr as $key => $val) {
            $md5str = $md5str . $key . "=" . $val . "&";
        }
        $sign_str = rtrim($md5str, "&") . $pay_config['key'];

        $arr['sign'] = md5($sign_str);

        $request_url = $pay_config['request_url_query'];              // 请求的页面地址  
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['state']) && $resarray['data']['state'] == '1') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /**
          1:成功，其他表示失败
         */
    }

    /**
     * 易宝支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function yibao($parameters = [], $pay_config = [])
    {
        include_once Env::get('extend_path') . 'yibaoSdk/lib/YopClient3.php';

        $merchantNo = $pay_config['app_id'];
        $parentMerchantNo = $pay_config['merchant_id'];
        $yop_public_key = $pay_config['other_public_key'];
        $private_key = $pay_config['key'];
        $serverRoot = $pay_config['request_url'];

        $body = ['goodsName' => $parameters['body'], 'goodsDesc' => $parameters['order_id']];

        $arr['parentMerchantNo'] = $parentMerchantNo;               // 父商编
        $arr['merchantNo'] = $merchantNo;                           // 子商编
        $arr['orderId'] = $parameters['order_id'];                  // 商户订单号
        $arr['orderAmount'] = $parameters['cash'];                  // 单位：元
        $arr['notifyUrl'] = $pay_config['notify_url'];              // 服务器通知地址
        $arr['goodsParamExt'] = json_encode($body);           // 商品拓展信息
        $arr['timeoutExpress'] = 100;                               // 订单有效期
        $arr['timeoutExpressType'] = 'MINUTE';                      // 订单过期时间类型
        $arr['requestDate'] = date("Y-m-d H:i:s");                  // 请求时间
        $arr['redirectUrl'] = $parameters['tj_return_url'];         // 页面地址
        $arr['paymentParamExt'] = '';                               // 支付拓展信息
        $arr['industryParamExt'] = '';                              // 行业拓展参数
        $arr['riskParamExt'] = '';                                  // 风控拓展参数
        $arr['memo'] = date('YmdHis');                              // 自定义对账备注
        $arr['assureType'] = 'REALTIME';                            // 资金到账类型
        $arr['csUrl'] = '';                                         // 清算回调地址
        $arr['fundProcessType'] = 'REAL_TIME';                      // 资金处理类型
        $arr['divideDetail'] = '';                                  // 分账明细
        $arr['divideNotifyUrl'] = '';                               // 分账成功通知商户地址
        $arr['timeoutNotifyUrl'] = '';                              // 订单超时回告商户地址
        $arr['assurePeriod'] = '';                                  // 担保周期

        $request = new \YopRequest("OPR:" . $parentMerchantNo, $private_key, $serverRoot, $yop_public_key);
        foreach ($arr as $keys => $values) {
            $request->addParam($keys, $values);
        }

        $response = \YopClient3::post("/rest/v1.0/std/trade/order", $request);
        $resdata = json_encode($response);
        $resarray = json_decode($resdata, true);
        if (!isset($resarray['result']['token'])) {
            return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        $token = $resarray['result']['token'];
        $cashter = [
            "merchantNo" => $merchantNo,
            "token" => $token,
            "timestamp" => time(),
            "directPayType" => '',
            "cardType" => '',
            "userNo" => '',
            "userType" => '',
            "ext" => '',
        ];

        $str = "";
        foreach ($cashter as $key => $value) {
            $str .= $key . "=" . $value . "&";
        }
        $content = substr($str, 0, strlen($str) - 1);
        $sign = \YopSignUtils::signRsa($content, $private_key);
        $getUrl = $content . "&sign=" . $sign;

        //$getUrl = str_replace("&timestamp", "&amp;timestamp", $getUrl);
        $url = "https://cash.yeepay.com/cashier/std?" . $getUrl;
        if (isset($resarray['result']['token'])) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
    }

    /**
     * 易宝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function yibaoVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        include_once Env::get('extend_path') . 'yibaoSdk/lib/YopClient3.php';

        $merchantNo = $pay_config['app_id'];
        $parentMerchantNo = $pay_config['merchant_id'];
        $yop_public_key = $pay_config['other_public_key'];
        $private_key = $pay_config['key'];
        $serverRoot = $pay_config['request_url'];

        $request = new \YopRequest("OPR:" . $parentMerchantNo, $private_key, $serverRoot, $yop_public_key);
        $request->addParam("parentMerchantNo", $parentMerchantNo);
        $request->addParam("merchantNo", $merchantNo);
        $request->addParam("orderId", $order_id);

        $response = \YopClient3::post("/rest/v1.0/std/trade/orderquery", $request);
        $resdata = json_encode($response);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['result']['status']) && $resarray['result']['status'] == 'SUCCESS') {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($request, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($request, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          PROCESSING：待支付
          CLOSE：订单关闭
          REJECT：订单拒绝
          TIME_OUT：订单过期
          SUCCESS：订单成功
          REPEALED：撤销完成
          REVOKED：订单取消
          REVERSAL：交易冲正
         */
    }

    /**
     * 连连支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function lianlian($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'kuaijie':
                $flag_pay_product = '0';
                $flag_chnl = '3';
                break;
            case 'wangyin':
                $flag_pay_product = '2';
                $flag_chnl = '2';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['api_version'] = '1.0';                                         // 当前版本为1.0
        $arr['sign_type'] = 'RSA';                                           // RSA
        $arr['time_stamp'] = date('YmdHis');                                 // 时间
        $arr['platform'] = '';                                               // 平台来源标识：此处不用上送 可选
        $arr['oid_partner'] = $pay_config['merchant_id'];                    // 商户编号
        $arr['user_id'] = date('YmdHis') . rand(100000, 999999);             // 用户编号
        $arr['busi_partner'] = '101001';                                     // 虚拟商品销售：101001。实物商品销售：109001。
        $arr['no_order'] = $parameters['order_id'];                          // 商户订单号
        $arr['dt_order'] = '20' . substr($parameters['order_id'], 0, 12);    // 商户订单时间
        $arr['name_goods'] = $parameters['body'];                      // 商户商品名称 可选
        $arr['info_order'] = date('YmdHis');                                 // 订单扩展字段 可选
        $arr['money_order'] = $parameters['cash'];                           // 交易金额 元
        $arr['notify_url'] = $pay_config['notify_url'];                      // 接收异步通知的线上地址
        $arr['url_return'] = $parameters['tj_return_url'];                   // 支付结束后，连连会将消费者重定向至此地址 可选
        $arr['back_url'] = '';                                               // 传入后在收银台页面激活返回按钮 可选
        $arr['valid_order'] = '120';                                         // 订单有效期 分 可选
        $arr['shareing_data'] = '';                                          // 分账信息 可选
        $arr['risk_item'] = json_encode(['frms_ware_category' => 1002]);     // 风险控制参数
        $arr['flag_pay_product'] = '0';                                      // 支付产品标识 0 快捷收款 1 认证收款 2 网银收款 5 新认证收款 12 手机网银收款 。
        $arr['flag_chnl'] = '3';                                             // 应用渠道标识 0 App-Android 1 App-iOS 2 Web 3 H5
        $arr['id_type'] = '';                                                // 证件类型 0 身份证 1 户口簿 2 护照 3 军官证 4 士兵证 5 港澳居民来往内地通行证 6 台湾同胞来往内地通行证 7 临时身份证 8 外国人居住证 9 警官证 10 组织机构代码 X 其他证件。 可选
        $arr['id_no'] = '';                                                  // 证件号码 对应id_type的相关证件号码。可选
        $arr['acct_name'] = '';                                              // 用户姓名 可选
        $arr['card_no'] = '';                                                // 用户银行卡卡号 可选
        $arr['no_agree'] = '';                                               // 签约协议编号 可选
        $arr['bank_code'] = '';                                              // 银行编码 可选
        $arr['card_type'] = '0';                                             // 卡类型 0 借记卡 1 信用卡 2 企业网银。
        $arr['theme'] = '';                                                  // 主题配色 可选
        $arr['show_head'] = 'show';                                          // 是否显示收银台/认证中心的页头 show - 显示。hide - 隐藏。 可选

        $arr = array_filter($arr);
        $arr['flag_pay_product'] = $flag_pay_product;                        // 支付产品标识 0 快捷收款 1 认证收款 2 网银收款 5 新认证收款 12 手机网银收款 。
        $arr['flag_chnl'] = $flag_chnl;                                      // 应用渠道标识 0 App-Android 1 App-iOS 2 Web 3 H5

        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = rtrim($string, '&');

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $private_key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $res = openssl_get_privatekey($private_key);
        openssl_sign($string, $sign, $res, OPENSSL_ALGO_MD5);

        $arr['sign'] = base64_encode($sign);
        $arr_str = json_encode($arr);

        $header = [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($arr_str)
        ];

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr_str, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['gateway_url']) && strlen($resarray['gateway_url']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 连连支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function lianlianVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['oid_partner'] = $pay_config['merchant_id'];                    // 商户编号
        $arr['sign_type'] = 'RSA';                                           // RSA
        $arr['no_order'] = $order_id;                                        // 商户订单号
        $arr['dt_order'] = '20' . substr($order_id, 0, 12);                  // 商户订单时间
        $arr['oid_paybill'] = '';                                            // 连连付款单号 可选
        $arr['query_version'] = '1.1';                                       // 查询版本号

        $arr = array_filter($arr);

        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $string = rtrim($string, '&');

        $temp = chunk_split($pay_config['key'], 64, "\n");
        $private_key = "-----BEGIN RSA PRIVATE KEY-----\n$temp-----END RSA PRIVATE KEY-----\n";

        $res = openssl_get_privatekey($private_key);
        openssl_sign($string, $sign, $res, OPENSSL_ALGO_MD5);

        $arr['sign'] = base64_encode($sign);
        $arr_str = json_encode($arr);

        $header = [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($arr_str)
        ];

        $request_url = $pay_config['request_url_query'];         // 请求查询地址

        $resdata = go_curl($request_url, $arr_str, 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['result_pay']) && $resarray['result_pay'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          result_pay
          SUCCESS，     成功。
          WAITING，     等待支付。
          PROCESSING，  银行支付处理中。
          REFUND，      退款。
          FAILURE，     失败 。
         */
    }

    /**
     * 商易通支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function shangyitong($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = 'alipay_h5';
                break;
            case 'alipay_scan_code':
                $type = 'alipay_scan_code';
                break;
            case 'wechat_h5':
                $type = 'wechat_h5';
                break;
            case 'wechat_scan_code':
                $type = 'wechat_scan_code';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['mch_id'] = $pay_config['merchant_id'];                        // 商户号
        $arr['order_amount'] = $parameters['cash'];                         // 支付金额
        $arr['nonce_str'] = date('YmdHis') . rand(100000, 999999);          // 随机字符串（只能为数字、字母）
        $arr['out_trade_no'] = $parameters['order_id'];                     // 唯一订单号
        $arr['notify_url'] = $pay_config['notify_url'];                     // 支付通知地址

        ksort($arr);
        $signstr = '';
        foreach ($arr as $key => $value) {
            $signstr .= $key . '=' . $value . '&';
        }
        $strs = $signstr . 'key=' . $pay_config['key'];

        $arr['sign'] = strtoupper(md5($strs));

        $request_url = $pay_config['request_url'];                          // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['pay_url']) && strlen($resarray['pay_url']) > 10) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 商易通支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function shangyitongVerify($order_id = 0, $pay_config = [], $recharge = [])
    {
        return ['code' => 300, 'msg' => '', 'data' => ''];
    }

    /**
     * 火影支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function huoying($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'alipay_h5':
                $type = '1';
                break;
            case 'alipay_scan_code':
                $type = '2';
                break;
            case 'wechat_h5':
                $type = '4';
                break;
            case 'wechat_scan_code':
                $type = '5';
                break;
            case 'unionpay_scan_code':
                $type = '8';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['merchantid'] = $pay_config['merchant_id'];                // 商户编号
        /*
          支付宝H5	1	96-198-306-507-857-1157-2055-3057-4988	开启
          支付宝扫码	2	300-5000	                        开启
          支付宝h5话费	3	10-20-30-50-100-200-300-500	        开启
          微信h5        4	199-299-498-997-1999-2996-4995	        开启
          微信扫码	5	                                        维护
          微信h5话费	6	10-20-30-50-100-200-300-500	        开启
          云闪付        7	                                    	维护
          银联扫码	8	                                    	维护
          支付宝h5小额	10	10-5000	                                开启
         */
        if ($parameters['type'] == 'alipay_h5') {
            if ($pay_config['other_one']) {
                $type = $pay_config['other_one'];
            }
        }
        if ($parameters['type'] == 'wechat_h5') {
            if ($pay_config['other_two']) {
                $type = $pay_config['other_two'];
            }
        }

        $arr['wayid'] = $type;                                          // 渠道编号
        $arr['waytype'] = $type;                                        // 支付类型
        $arr['merchantorder'] = $parameters['order_id'];                // 商户订单号
        $arr['userid'] = rand(10000000, 99999999);                      // 用户id
        $arr['money'] = intval(strval($parameters['cash'] * 100));      // 订单金额(分)
        $arr['backurl'] = $parameters['tj_return_url'];                 // 同步回调地址
        $arr['notifyurl'] = $pay_config['notify_url'];                  // 异步回调地址
        $arr['extparam'] = $arr['userid'];                              // 特殊支付配置使用
        $arr['clientip'] = $parameters['ip'];                           // 用户IP
        $arr['signtype'] = 'MD5';                                       // 目前只支持MD5

        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $prestr = $string . 'key=' . $pay_config['key'];
        $arr['payformat'] = 'json';
        $arr['sign'] = md5($prestr);

        $request_url = $pay_config['request_url'];                   // 请求地址
        $resdata = go_curl($request_url, $arr, 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']['payurl']) && strlen($resarray['data']['payurl']) > 10) {
            // 成功     
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 火影支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function huoyingVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['merchantid'] = $pay_config['merchant_id'];
        $arr['merchantorder'] = $order_id;
        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }
        $prestr = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = md5($prestr);

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'post', 5);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['code']) && $resarray['code'] == '1') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 掌宜支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function zhangyi($parameters = [], $pay_config = [])
    {

        /*
          1 微信 H5
          2 支付宝 H5
          3 银联 H5
          4 微信扫码
          5 微信公众号
          6 QQ 钱包
          7 QQ 钱包公众号
          8 支付宝扫码
          9 京东 WAP
          10 京东扫码
          11 QQ 钱包扫码
          12 微信小程序
          13 银联扫码
         */
        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 4;
                break;
            case 'wechat_h5':
                $type = 1;
                break;
            case 'alipay_scan_code':
                $type = 8;
                break;
            case 'alipay_h5':
                $type = 2;
                break;
            case 'kuaijie':
                $type = 3;
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['partner_id'] = $pay_config['merchant_id'];         // 商户 ID
        $arr['app_id'] = $pay_config['app_id'];                  // 应用 ID
        $arr['wap_type'] = $type;                                // 支付方式
        $arr['money'] = $parameters['cash'];                     // 正整数，以分为单位
        $arr['out_trade_no'] = $parameters['order_id'];          // 商户订单编号
        $arr['subject'] = $parameters['order_id'];               // 商品名称
        $arr['client_ip'] = Request::instance()->ip();    // 客户 IP
        $arr['bank_code'] = '';                                  // 银行代码
        $arr['imei'] = '';                                       // 用户唯一标识
        $arr['openid'] = '';                                     // 微信用户 id
        $arr['wxa_jump'] = '';                                   // 跳转微信小程序标识
        $arr['is_h5'] = '';                                      // 是否返回类 h5 跳转地址
        $arr['to_qrcode'] = '';                                  // 商户渠道代码
        $arr['qn'] = $parameters['verify_param'];                // 交易结果回调通知将传递此参数
        $arr['return_url'] = '';                                 // 支付后返回地址

        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $prestr = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = strtoupper(md5($prestr));

        $request_url = $pay_config['request_url'];               // 请求地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 掌宜支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zhangyiVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['partner_id'] = $pay_config['merchant_id'];         // 商户 ID
        $arr['app_id'] = $pay_config['app_id'];                  // 应用 ID
        $arr['out_trade_no'] = $order_id;                        // 商户订单编号

        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $prestr = $string . 'key=' . $pay_config['key'];
        $arr['sign'] = strtoupper(md5($prestr));

        $request_url = $pay_config['request_url_query'];         // 请求查询地址
        $resdata = go_curl($request_url, $arr, 'get', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['code']) && $resarray['code'] == '0') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];

        /*
          0 交易成功
          1 交易处理中
          2 交易未完成 （超过 60 秒的交易）
          3 无此订单号
          其他为错误代码
         */
    }

    /**
     * 银联支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function chinaums($parameters = [], $pay_config = [])
    {

        /*
          支付宝H5支付：trade.h5Pay
          微信H5支付：WXPay.h5Pay
          银联在线无卡：qmf.h5Pay
          银联云闪付（走银联全渠道）：uac.order
         */
        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 'WXPay.h5Pay';
                break;
            case 'wechat_h5':
                $type = 'WXPay.h5Pay';
                break;
            case 'alipay_scan_code':
                $type = 'trade.h5Pay';
                break;
            case 'alipay_h5':
                $type = 'trade.h5Pay';
                break;
            case 'kuaijie':
                $type = 'qmf.h5Pay';
                break;
            case 'unionpay_scan_code':
                $type = 'uac.order';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $arr['msgId'] = '';                                                         // 消息ID，原样返回
        $arr['requestTimestamp'] = date('Y-m-d H:i:s');                             // 报文请求时间，格式yyyy-MM-dd HH:mm:ss
        $arr['merOrderId'] = $pay_config['public_key'] . $parameters['order_id'];   // 商户订单号
        $arr['srcReserve'] = '';                                                    // 请求系统预留字段
        $arr['mid'] = $pay_config['merchant_id'];                                   // 商户号
        $arr['tid'] = $pay_config['app_id'];                                        // 终端号
        $arr['msgSrc'] = $pay_config['other_public_key'];                           // 消息来源
        $arr['msgType'] = $type;                                                    // 消息类型
        $arr['instMid'] = 'H5DEFAULT';                                              // 业务类型 H5DEFAULT
        $arr['goods'] = '';                                                         // 商品信息
        $arr['attachedData'] = $parameters['verify_param'];                         // 商户附加数据
        $arr['orderDesc'] = '';                                                     // 账单描述
        $arr['goodsTag'] = '';                                                      // 商品标记，用于优惠活动
        $arr['originalAmount'] = '';                                                // 订单原始金额，单位分，用于记录前端系统打折前的金额
        $arr['totalAmount'] = $parameters['cash'];                                  // 支付总金额，单位分
        $arr['expireTime'] = date('Y-m-d H:i:s', time() + 60);                      // 订单过期时间，格式：yyyy-MM-dd HH:mm:ss
        $arr['secureTransaction'] = '';                                             // 标识是否是担保交易
        $arr['notifyUrl'] = $pay_config['notify_url'];                              // 支付结果通知地址
        $arr['returnUrl'] = urlencode($this->returnUrl($parameters['order_id']));   // 网页跳转地址
        $arr['systemId'] = '';                                                      // 系统ID
        $arr['sceneType'] = 'AND_WAP';                                              // 业务应用类型：微信H5支付必填,用于苹app应用里值为IOS_SDK ；用于安卓app 应用里值为AND_SDK；用于手机网站，值为IOS_WAP 或AND_WAP
        $arr['merAppName'] = '全民付';                                              // 微信H5支付必填。用于苹或安卓app 应用中，传分别 对应在 AppStore和安卓分发市场中的应用名（如：全民付）；用于手机网站，传对应的网站名（如：银联商务官网）
        $arr['merAppId'] = 'https://www.baidu.com';                                 // 微信H5支付必填。用于苹果或安卓 app 应用中，苹果传 IOS 应用唯一标识(如： com.tencent.wzryIOS )安卓传包名 (如： com.tencent.tmgp.sgame)如果是用于手机网站 ，传首页 URL 地址 , (如： https://m.jd.com ) ，支付宝H5支付参数无效
        $arr['limitCreditCard'] = '';                                               // 是否需要限制信用卡支付
        $arr['divisionFlag'] = '';                                                  // 分账标记：暂时只支持微信、支付宝支付和银联云闪付。若为true，则goods字段和subOrders字段不能同时为空，且secureTransaction字段上送false或不上送。
        $arr['platformAmount'] = '';                                                // 平台商户分账金额
        $arr['subOrders'] = '';                                                     // 子订单信息
        $arr['name'] = '';                                                          // 1.无卡支付指定付款人时必传 2.支付宝实名认证时必传，Base64编码
        $arr['mobile'] = '';                                                        // 无卡支付指定付款人时必传，Base64编码
        $arr['certType'] = '';                                                      // 1.无卡支付指定付款人时必传 2.支付宝实名认证时必传，证件类型：身份证：IDENTITY_CARD、护照：PASSPORT、军官证：OFFICER_CARD、士兵证：SOLDIER_CARD、户口本：HOKOU 注意：无卡支付目前仅支持身份证
        $arr['certNo'] = '';                                                        // 证件号1.无卡支付指定付款人时必传 2.支付宝实名认证时必传，，Base64编码
        $arr['fixBuyer'] = '';                                                      // 是否需要实名认证,需要实名认证时置为 T
        $arr['bankCardNo'] = '';                                                    // 卡号
        $arr['installmentNumber'] = '';                                             // 花呗分期数
        $arr['retCommParams'] = '';                                                 // 扫码点餐类型
        $arr['asynDivisionFlag'] = '';                                              // 异步分账标记
        $arr['signType'] = 'SHA256';                                                // 上送值为：SHA256 

        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $string = rtrim($string, '&') . $pay_config['key'];
        $arr['sign'] = trim(hash("sha256", $string));

        $request_url = $pay_config['request_url'];               // 请求地址

        $resdata = $request_url . '?' . http_build_query($arr);
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 银联支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function chinaumsVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['msgId'] = '';                                                         // 消息ID，原样返回
        $arr['requestTimestamp'] = date('Y-m-d H:i:s');                             // 报文请求时间，格式yyyy-MM-dd HH:mm:ss
        $arr['merOrderId'] = $pay_config['public_key'] . $order_id;                 // 商户订单号
        $arr['srcReserve'] = '';                                                    // 请求系统预留字段
        $arr['mid'] = $pay_config['merchant_id'];                                   // 商户号
        $arr['tid'] = $pay_config['app_id'];                                        // 终端号
        $arr['msgSrc'] = $pay_config['other_public_key'];                           // 消息来源
        $arr['msgType'] = 'query';                                                  // 消息类型
        $arr['instMid'] = 'H5DEFAULT';                                              // 业务类型 H5DEFAULT
        $arr['signType'] = 'SHA256';                                                // 上送值为：SHA256 

        $arr = array_filter($arr);
        ksort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $string = rtrim($string, '&') . $pay_config['key'];
        $arr['sign'] = trim(hash("sha256", $string));

        $request_url = $pay_config['request_url_query'];         // 请求查询地址

        $resdata = go_curl($request_url, json_encode($arr), 'post', $pay_config['wait_second']);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['status']) && $resarray['status'] == 'TRADE_SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 传化支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function chuanhua($parameters = [], $pay_config = [])
    {

        switch ($parameters['type']) {
            case 'wechat_scan_code':
                $type = 'WXNATIVE';
                break;
            case 'wechat_h5':
                $type = 'WXH5';
                break;
            case 'alipay_scan_code':
                $type = 'ZFBNATIVE';
                break;
            case 'alipay_h5':
                $type = 'ZFBH5';
                break;
            case 'kuaijie':
                $type = 'UNIONPAYJS';
                break;
            default:
                return ['code' => 300, 'msg' => '支付类型不存在'];
        }

        $domain_url = $pay_config['other_one'] ? $pay_config['other_one'] : '';
        $return_url = $this->returnUrl($parameters['order_id'], $domain_url);
        $notify_url = $pay_config['other_two'] ? $pay_config['other_two'] : $pay_config['notify_url'];

        $arr['service_id'] = 'tf56pay.gateway.multiPay';      // 接口服务ID
        $arr['appid'] = $pay_config['app_id'];                // 商户注册时申请的应用编号，由运营申请分配
        $arr['tf_timestamp'] = date('YmdHis');                // 时间戳格式：yyyyMMddHHmmss，如20141126161900
        $arr['sign_type'] = 'RSA';                            // 商户生成签名字符串所使用的签名算法类型，目前支持MD5，RSA和RSA2，推荐使用RSA2或RSA
        $arr['terminal'] = 'PC';                              // PC、Android、IOS、WP、EPOS、POS、ETC、PARK、MJ、SCANNER、CARD、H5
        $arr['version'] = '';                                 // 版本号 空

        $arr['backurl'] = $notify_url;                        // 传化支付主动通知商户服务器交易结果,回调地址
        $arr['fronturl'] = $return_url;                       // 页面跳转同步通知页面路径
        $arr['subject'] = '订单号' . $parameters['order_id'];  // 商品名称
        $arr['businesstype'] = '商家消费';                     // 业务类型 
        $arr['kind'] = '其他商家消费';                         // 消费场景
        $arr['description'] = '';                             // 商品描述 空
        $arr['businessnumber'] = $parameters['order_id'];     // 需保证在商户端不重复，需保证在商户端不重复, 建议字母和数字的组合。
        $arr['billamount'] = $parameters['cash'];             // 交易金额
        $arr['toaccountnumber'] = $pay_config['other_three']; // 收款方支付账号
        $arr['bankcode'] = $type;                             // 银行编号，请参考银行码表
        /*
        聚合支付	
        微信扫码	WXNATIVE
    	微信小程序	WXXCX
	    支付宝扫码	ZFBNATIVE
	    微信APP支付	WXAPP
	    支付宝APP支付	ZFBAPP
	    支付宝生活号支付	ZFBSHH
	    微信公众号	WXJSAPI
	    微信H5支付	WXH5
	    银联主扫	YLZS
	    QQ钱包扫码	QQNATIVE
	    支付宝H5支付	ZFBH5
    	支付宝钱包支付	ZFBPAY1
    	支付宝APP支付B	ZFBPAY2
    	银联js支付	UNIONPAYJS
	    云闪付A	QuickPassA
	    微信钱包支付	WXAPP1
        */
        $arr['aggregationcode'] = '';                         // 多级代理商编号 空
        $arr['clientip'] = Request::instance()->ip();         // 客户端请求IP
        $arr['billsubtype'] = '01';                           // 订单业务类型 01	标准订单02	前置分账03	后置分账，目前只支持交易类型为“消费”的订单
        $arr['shareinfo'] = '';                               // 格式：分账账号，分账金额当billsubtype=02时该字段必填，分账总金额等于交易金额  空
        $arr['usertoken'] = '';                               // 会员登录授权码  空
        $arr['bankcardtype'] = '';                            // 01：储蓄卡02：信用卡  空

        $arr['merchantuserid'] = '';                          // 在商户平台中用户id
        $arr['merchantemail'] = '';                           // 在商户平台中用户邮箱地址
        $arr['merchtdevicename'] = '';                        // 支付设备类型：PC端传MAC手机端传IMEIIOS设备传UDID
        $arr['merchtdevicevalue'] = '';                       // 支付设备类型对应的值
        $arr['merchtonline'] = 1;                             // 0-线上交易，1-线下交易（实体零售，扫码支付等）
        $arr['deliveryaddrfull'] = '';                        // 收货地址全名
        $arr['deliveryaddrpro'] = '';                         // 收货人地址省
        $arr['deliveryaddrcit'] = '';                         // 收货地址市级
        $arr['deliveryaddrdis'] = '';                         // 收货地址县/区
        $arr['deliveryaddrstr'] = '';                         // 收货地址街道
        $arr['deliveryname'] = '';                            // 收货人姓名
        $arr['deliveryphone'] = '';                           // 收货人联系手机 

        $arr = array_filter($arr);
        krsort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $pkey = chunk_split($pay_config['key'], 64, "\n");
        $pkey = "-----BEGIN PRIVATE KEY-----\n" . $pkey . "-----END PRIVATE KEY-----\n";

        $cert = chunk_split($pay_config['other_public_key'], 64, "\n");
        $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n";

        $header = [];
        $path = Env::get('root_path') . 'data' . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR;
        $infilename = $path . 'in' . $parameters['order_id'] . '.txt';
        $outfilename = $path . 'out' . $parameters['order_id'] . '.txt';
        file_put_contents($infilename, $string);
        openssl_pkcs7_sign(
            $infilename,
            $outfilename,
            $cert,
            $pkey,
            $header,
            PKCS7_BINARY | PKCS7_DETACHED
        );

        $signedData = explode("\n\n", file_get_contents($outfilename));

        $arr['tf_sign'] = str_replace("\n", '', $signedData[3]);

        $request_url = $pay_config['request_url'];    // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']) && strlen($resarray['data']) > 10) {
            // 成功  
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 传化支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function chuanhuaVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        $arr['service_id'] = 'tf56pay.gateway.orderQuery';    // 接口服务ID
        $arr['appid'] = $pay_config['app_id'];                // 商户注册时申请的应用编号，由运营申请分配
        $arr['tf_timestamp'] = date('YmdHis');                // 时间戳格式：yyyyMMddHHmmss，如20141126161900
        $arr['sign_type'] = 'RSA';                            // 商户生成签名字符串所使用的签名算法类型，目前支持MD5，RSA和RSA2，推荐使用RSA2或RSA
        $arr['terminal'] = 'PC';                              // PC、Android、IOS、WP、EPOS、POS、ETC、PARK、MJ、SCANNER、CARD、H5
        $arr['version'] = '';                                 // 版本号 空

        $arr['businessnumber'] = $order_id;                   // 需保证在商户端不重复，需保证在商户端不重复, 建议字母和数字的组合。

        $arr = array_filter($arr);
        krsort($arr);
        $string = '';
        foreach ($arr as $k => $v) {
            $string .= $k . '=' . $v . '&';
        }

        $pkey = chunk_split($pay_config['key'], 64, "\n");
        $pkey = "-----BEGIN PRIVATE KEY-----\n" . $pkey . "-----END PRIVATE KEY-----\n";

        $cert = chunk_split($pay_config['other_public_key'], 64, "\n");
        $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n";

        $header = [];
        $path = Env::get('root_path') . 'data' . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR;
        $infilename = $path . 'in' . $order_id . '.txt';
        $outfilename = $path . 'out' . $order_id . '.txt';
        file_put_contents($infilename, $string);
        openssl_pkcs7_sign(
            $infilename,
            $outfilename,
            $cert,
            $pkey,
            $header,
            PKCS7_BINARY | PKCS7_DETACHED
        );

        $signedData = explode("\n\n", file_get_contents($outfilename));

        $arr['tf_sign'] = str_replace("\n", '', $signedData[3]);

        $request_url = $pay_config['request_url'];    // 请求地址
        $resdata = go_curl($request_url, http_build_query($arr), 'post', $pay_config['wait_second'], $header);
        $resarray = json_decode($resdata, true);
        if (isset($resarray['data']) && strlen($resarray['data']) > 10) {

            $data = json_decode($resarray['data'], true);
            if (isset($data['status']) && $data['status'] == '成功') {
                // 支付成功
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 微信支付
     * @access public
     * @param  array   $parameters  创建订单参数
     * @param  array   $pay_config  支付配置
     * @return boolean
     */
    public function wxpay($parameters = [], $pay_config = [])
    {

        if ($pay_config['other_five'] == 1) {
            include_once Env::get('extend_path') . 'wechatSdk/example/WxPay.NativePay.php';

            define('WX_AppId', $pay_config['app_id']);
            define('WX_MerchantId', $pay_config['merchant_id']);
            define('WX_Key', $pay_config['key']);
            define('WX_AppSecret', $pay_config['public_key']);

            $verify_param = $parameters['verify_param'];

            $notify_url = $pay_config['notify_url'];

            if ($parameters['type'] == 'wechat_scan_code') {
                $notify = new \NativePay();

                $input = new \WxPayUnifiedOrder();
                $input->SetBody($parameters['body']);
                $input->SetAttach($verify_param);
                $input->SetOut_trade_no($parameters['order_id']);
                $input->SetTotal_fee($parameters['cash'] * 100);
                $input->SetTime_start(date("YmdHis"));
                $input->SetTime_expire(date("YmdHis", time() + 600));
                $input->SetGoods_tag($parameters['order_id']);
                $input->SetNotify_url($notify_url);
                $input->SetTrade_type('NATIVE');
                $input->SetProduct_id($parameters['order_id']);
                $input->SetSpbill_create_ip(Request::instance()->ip());

                $resarray = $notify->GetPayUrl($input);
                $resdata = json_encode($resarray);
                if (isset($resarray['code_url']) && strlen($resarray['code_url']) > 10) {
                    return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
                }
            }

            if ($parameters['type'] == 'wechat_h5') {
                $input = new \WxPayUnifiedOrder();
                $input->SetBody($parameters['body']);
                $input->SetAttach($verify_param);
                $input->SetOut_trade_no($parameters['order_id']);
                $input->SetTotal_fee($parameters['cash']);
                $input->SetTime_start(date("YmdHis"));
                $input->SetTime_expire(date("YmdHis", time() + 600));
                $input->SetGoods_tag($parameters['order_id']);
                $input->SetNotify_url($notify_url);
                $input->SetTrade_type('MWEB');
                $input->SetSpbill_create_ip(Request::instance()->ip());

                $config = new \WxPayConfig();
                $resarray = \WxPayApi::unifiedOrder($config, $input);
                $resdata = json_encode($resarray);
                if (isset($resarray['mweb_url']) && strlen($resarray['mweb_url']) > 10) {
                    return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
                }
            }
        }



        // 微信v3版
        $arr['appid'] = $pay_config['app_id'];                                                   // 应用ID
        $arr['mchid'] = $pay_config['merchant_id'];                                              // 直连商户号
        $arr['description'] = '订单号' . $parameters['order_id'];                                 // 商品描述
        $arr['out_trade_no'] =  $parameters['order_id'];                                         // 商户订单号
        $arr['time_expire'] = date('Y-m-d') . 'T' . date('H:i:s', (time() + 600)) . '+08:00';    // 订单失效时间
        $arr['attach'] = $parameters['verify_param'];                                            // 附加数据
        $arr['notify_url'] = $pay_config['notify_url'];                                          // 通知地址
        $arr['amount'] = ['total' => $parameters['cash'] * 100, 'currency' => 'CNY'];            // 订单总金额，单位为分  货币类型

        if ($parameters['type'] == 'wechat_h5') {

            $arr['scene_info'] = ['payer_client_ip' => Request::instance()->ip(), 'h5_info' => ['type' => 'Wap']];     // 场景信息

            $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/h5';

            $body = json_encode($arr);

            $url_parts = parse_url($url);
            $canonical_url = $url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : "");
            $message = $http_method . "\n" .
                $canonical_url . "\n" .
                $timestamp . "\n" .
                $nonce . "\n" .
                $body . "\n";

            openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
            $sign = base64_encode($raw_sign);

            $token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $mchid, $nonce, $timestamp, $serial_no, $sign);

            $header = [
                'Accept: application/json',
                'User-Agent: */*',
                'Content-Type: application/json; charset=utf-8',
                'Authorization: ' . $token,
            ];

            $resdata = go_curl($url, $body, 'post', $pay_config['wait_second'], $header);
            $resarray = json_decode($resdata, true);
            if (isset($resarray['h5_url']) && strlen($resarray['h5_url']) > 10) {
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
            // {"h5_url":"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx1316455725306615ca32131e9c87970000&package=1093645955"}
        }

        if ($parameters['type'] == 'wechat_scan_code') {

            $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/native';

            $body = json_encode($arr);

            $url_parts = parse_url($url);
            $canonical_url = $url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : "");
            $message = $http_method . "\n" .
                $canonical_url . "\n" .
                $timestamp . "\n" .
                $nonce . "\n" .
                $body . "\n";

            openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
            $sign = base64_encode($raw_sign);

            $token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $mchid, $nonce, $timestamp, $serial_no, $sign);

            $header = [
                'Accept: application/json',
                'User-Agent: */*',
                'Content-Type: application/json; charset=utf-8',
                'Authorization: ' . $token,
            ];

            $resdata = go_curl($url, $body, 'post', $pay_config['wait_second'], $header);
            $resarray = json_decode($resdata, true);
            if (isset($resarray['code_url']) && strlen($resarray['code_url']) > 10) {
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
            // {"code_url": "weixin://wxpay/bizpayurl?pr=p4lpSuKzz"}
        }

        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 微信支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function wxpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        include_once Env::get('extend_path') . 'wechatSdk/lib/WxPay.Api.php';
        include_once Env::get('extend_path') . 'wechatSdk/example/WxPay.Config.php';

        define('WX_AppId', $pay_config['app_id']);
        define('WX_MerchantId', $pay_config['merchant_id']);
        define('WX_Key', $pay_config['key']);
        define('WX_AppSecret', $pay_config['public_key']);

        $out_trade_no = $order_id;
        $input = new \WxPayOrderQuery();
        $input->SetOut_trade_no($out_trade_no);
        $config = new \WxPayConfig();
        $resarray = \WxPayApi::orderQuery($config, $input);
        $resdata = json_encode($resarray);
        if (isset($resarray['trade_state']) && $resarray['trade_state'] == 'SUCCESS') {
            // 支付成功
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($recharge, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($recharge, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        /*
          SUCCESS—支付成功
          REFUND—转入退款
          NOTPAY—未支付
          CLOSED—已关闭
          REVOKED—已撤销（刷卡支付）
          USERPAYING--用户支付中
          PAYERROR--支付失败(其他原因，如银行返回失败)
         */
    }

    /**
     * 支付宝支付
     * @access public
     * @param  array  $parameters   创建订单参数
     * @param  array  $pay_config   支付配置
     * @return array
     */
    public function zfbpay($parameters = [], $pay_config = [])
    {

        include_once Env::get('extend_path') . 'alipaySdk/aop/AopClient.php';
        include_once Env::get('extend_path') . 'alipaySdk/aop/request/AlipayTradePrecreateRequest.php';

        $verify_param = date('YmdHis') . rand(100000, 999999);
        $return_url = $parameters['return_url'];
        $notify_url = $pay_config['notify_url'];

        $arr['out_trade_no'] = $parameters['order_id'];
        $arr['total_amount'] = $parameters['cash'];
        $arr['subject'] = $parameters['body'];
        $arr['body'] = $verify_param;
        $arr['passback_params'] = $verify_param;
        $arr['timeout_express'] = '10m';

        $aop = new \AopClient();
        $aop->gatewayUrl = $pay_config['request_url'];
        $aop->appId = $pay_config['app_id'];
        $aop->rsaPrivateKey = $pay_config['key'];
        $aop->alipayrsaPublicKey = $pay_config['other_public_key'];
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'utf-8';
        $aop->format = 'json';
        $request = new \AlipayTradePrecreateRequest();
        $request->setReturnUrl($return_url);
        $request->setNotifyUrl($notify_url);
        $request->setBizContent(json_encode($arr));
        $result = $aop->execute($request);
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        $resdata = json_encode($result);
        if (!empty($resultCode) && $resultCode == 10000) {
            return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($parameters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 支付宝支付，验证订单号，是不是已经支付
     * @access public
     * @param  string  $order_id    平台订单号
     * @param  array   $pay_config  支付配置
     * @param  array   $recharge    支付数据
     * @return boolean
     */
    public function zfbpayVerify($order_id = 0, $pay_config = [], $recharge = [])
    {

        include_once Env::get('extend_path') . 'alipaySdk/aop/AopClient.php';
        include_once Env::get('extend_path') . 'alipaySdk/aop/request/AlipayTradeQueryRequest.php';

        $arr['out_trade_no'] = $order_id;
        $arr['trade_no'] = '';
        $arr['org_pid'] = '';
        $arr['query_options'] = ["TRADE_SETTE_INFO"];

        $aop = new \AopClient();
        $aop->gatewayUrl = $pay_config['request_url'];
        $aop->appId = $pay_config['app_id'];
        $aop->rsaPrivateKey = $pay_config['key'];
        $aop->alipayrsaPublicKey = $pay_config['other_public_key'];
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'utf-8';
        $aop->format = 'json';
        $request = new \AlipayTradeQueryRequest();
        $request->setBizContent(json_encode($arr));
        $result = $aop->execute($request);
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        $resdata = json_encode($result);
        if (!empty($resultCode) && $resultCode == 10000) {
            if ($result->$responseNode->trade_status == 'TRADE_SUCCESS') {
                return ['code' => 200, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
            }
        }
        return ['code' => 300, 'msg' => substr($resdata, 0, 60000), 'data' => json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)];
    }

    /**
     * 封装支付跳转地址，生成跳转url
     * @access public
     * @param  string $order_id      平台订单号 
     * @param  string $domain_url    域名url
     */
    public function returnUrl($order_id = 0, $domain_url = '')
    {

        $root = '/api.php/order/returl';
        $domain = $domain_url ? $domain_url : Request::instance()->domain();
        $url = $domain . $root . '/order_id/' . $order_id;
        return $url;
    }
}
